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

mcl*_*129 19 asp.net url redirect iis-7 http-status-code-404

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

谢谢,

麦克风

rsb*_*rro 27

是的,可以获取导致404错误的URL,您只需要确保正确配置了IIS.

您需要处理两种情况,一种是错误来自.aspx或其他由.NET处理的页面,另一种情况是错误来自错误的文件夹(如您的问题http://example.com/testurl)或文件名(例如,*.htm)不由.NET处理.在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>
Run Code Online (Sandbox Code Playgroud)

注意:如果您希望404页面实际返回404消息并且我认为不能通过IIS设置,则上面列出的redirectMode ="ResponseRewrite"非常重要.

在我的示例中,我创建了一个名为Error404.aspx的页面来处理所有404错误.当.NET页面(.aspx等)抛出404异常时,可以在aspxerrorpath querystring变量中找到原始文件名.当常规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; }
}
Run Code Online (Sandbox Code Playgroud)

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