我正在尝试实现一个通用的 .NET 3.5 ASPX 404 错误页面,该页面处理 IIS 7(经典模式)中的“未找到”请求以及代码中抛出的 404 HttpExceptions。我正在避免 customErrors 因为我想要一个真正的 404 返回码而不是重定向。
为此,我在 web.config 的 system.webserver 部分添加了以下内容:
<httpErrors>
<remove statusCode="404" subStatusCode="-1" />
<error statusCode="404" subStatusCode="-1" path="/virtualdir/errorpages/error404.aspx" responseMode="ExecuteURL" prefixLanguageFilePath="" />
</httpErrors>
我还在 Global.asax Application_Error 中添加了一个 Server.Transfer 调用来捕获代码中抛出的异常。
问题是相对路径(例如 app_themes 以及任何链接)是相对于错误页面而不是原始请求的 URL 计算的。
因此,对 /virtualdir/fail/fail/fail/fail/fail.html 的请求会尝试在 /virtualdir/fail/fail/fail/app_themes 找到 app_themes。
我认为可能有一个涉及 Request.RawUrl 的解决方案,但我还没有找到它。
我敢肯定我不是第一个遇到这个问题的人,但我的 Google Fu 这次让我失望了。
编辑
我已经做了一些调查,在不同的情况下,错误的 URL 要么保留在 Request.URL 属性(所需)中,要么作为查询字符串的一部分附加到错误页面 URL,格式为(/virtualdir/errorpages/error404.aspx ?404;http://host/virtualdir/fail/fail/fail/fail/fail.html)。
在我的 IIS 6 本地机器上,ASPX 错误以前一种方式运行,在 IIS 7 测试机上,ASPX 页面使用后一种方式。