我正在尝试实现一个通用的.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页面使用后一种方法。
答案 0 :(得分: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.
}
}
虽然感觉有点脏。我对声明性解决方案抱有希望。
答案 1 :(得分:0)
我现在无法测试它,但您是否尝试过使用代字号来使网址与app相关?例如:
<error statusCode="404" subStatusCode="-1" path="~/errorpages/error404.aspx" responseMode="ExecuteURL" prefixLanguageFilePath="" />