在IIS7的404重定向页面中访问原始URL

19
我在IIS 7上设置了一个自定义404页面作为我的网站的页面。但是我需要获取用户尝试访问的原始URL,以便在404页面上进行一些处理。问题在于,我需要专门处理不包含.aspx扩展名(例如http://example.com/testurl)的404错误,这些错误不会通过ASP.NET的自定义错误部分路由。我可以将IIS配置到我的自定义404,但此时我不知道如何获取原始URL?是否有人知道这是否可能?

1
你解决问题了吗?如果需要,我很乐意澄清我的答案。 - rsbarro
1个回答

27

可以获取导致404错误的URL,只需确保已正确配置IIS。

需要处理两种情况,一种是错误来自由.NET处理的.aspx或其他页面,另一种是错误来自未由.NET处理的错误文件夹(如您的问题中的http://example.com/testurl)或文件名(例如*.htm)。在IIS 7中,您需要在Web应用程序的“ASP.NET”部分的“.NET错误页面”下以及“IIS”部分的“错误页面”下配置自定义404错误。Web.config更改最终类似于以下内容:

<system.web>
    <!-- other system.web stuff -->
    <customErrors defaultRedirect="/Error404.aspx" mode="On" redirectMode="ResponseRewrite">
        <error redirect="/Error404.aspx" statusCode="404" />
    </customErrors>
</system.web>
<system.webServer>
    <!-- other system.webServer stuff -->
    <httpErrors errorMode="Custom">
        <remove statusCode="404" subStatusCode="-1" />
        <error statusCode="404" prefixLanguageFilePath="" path="/Error404.aspx" responseMode="ExecuteURL" />
    </httpErrors>
</system.webServer>

注意:上述提到的redirectMode="ResponseRewrite"非常重要,如果您希望404页面实际返回404消息,则需要使用该选项,并且我认为它无法通过IIS进行设置。

在我的示例中,我创建了一个名为Error404.aspx的页面来处理所有404错误。当.NET页面(.aspx等)引发404异常时,原始文件名可以在aspxerrorpath查询字符串变量中找到。当常规htm或其他页面引起404错误时,可以从Request.RawUrl属性中读取原始路径。我在我的Error404.aspx页面中使用以下代码来处理任一情况:

public partial class Error404 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        OriginalUrl = Request.QueryString["aspxerrorpath"] ?? Request.RawUrl;
        Server.ClearError();
        Response.Status = "404 not found";
        Response.StatusCode = 404;
    }

    public string OriginalUrl { get; private set; }
}

默认情况下,404错误页面不会返回404状态码,因此您需要手动设置。有关详细信息,请参见此帖子


1
感谢您的分享。我结合了这篇文章http://www.agilewebtechnologies.com/blog/post/2007/11/18/Redirects-Using-404-Error-Handling-in-ASPNET-20-on-Shared-Hosting-(Part-4).aspx,将其与我的代码相结合,实现了301重定向。在Error404中,我添加了Response.AddHeader("Location", OriginalUrl); Response.End();来完成这项工作。 - Dave
1
感谢您清晰详细的回答。我在微软网站上找不到这样的内容,浪费了一个多小时的时间。 - dvdmn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接