1

我正在尝试实现一个通用的 .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 页面使用后一种方式。

4

2 回答 2

1

这是我的解决方案:

string queryString = Request.Url.Query;
if (queryString.StartsWith("?404;"))
{
    try
    {
        Uri newUri = new Uri(queryString.Replace("?404;", String.Empty));

        HttpContext.Current.RewritePath(newUri.PathAndQuery);
    }
    catch (UriFormatException)
    {
        // Do nothing, the query string is malformed.
    }
}

不过感觉有点脏。我对声明性解决方案抱有希望。

于 2011-01-24T12:47:37.950 回答
0

我现在无法对其进行测试,但是您是否尝试过使用波浪号使 URL 与应用程序相关?例如:

<error statusCode="404" subStatusCode="-1" path="~/errorpages/error404.aspx" responseMode="ExecuteURL" prefixLanguageFilePath="" />
于 2011-01-22T16:33:34.130 回答