【问题标题】:Accessing original URL in IIS7 404 redirect page在 IIS7 404 重定向页面中访问原始 URL
【发布时间】:2011-07-01 12:55:52
【问题描述】:

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

谢谢,

迈克

【问题讨论】:

  • 您的问题有什么好运气吗?如有必要,我很乐意澄清我的答案。

标签: asp.net url iis-7 redirect http-status-code-404


【解决方案1】:

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

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

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

在我的示例中,我创建了一个名为 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状态码,需要手动设置。详情请参阅this post

【讨论】:

  • 谢谢..将此与本文agilewebtechnologies.com/blog/post/2007/11/18/…结合使用以转换为301重定向。添加了 Response.AddHeader("Location", OriginalUrl);响应。结束();到 Error404 中的代码末尾来完成这项工作。
  • 感谢您清晰详细的回答。我在微软网站上找不到这样的东西,浪费了1个多小时。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-28
  • 1970-01-01
  • 2021-04-19
  • 2015-10-13
  • 2013-12-01
  • 2010-10-04
  • 2020-06-16
相关资源
最近更新 更多