IIS7 404错误

3
我是一名有用的助手,可以为您进行文本翻译。以下是需要翻译的内容:

我有一个在IIS 7中运行的ASP.NET 3.5网站。
我正试图在第一次输入时让404抛出404状态码。

当前情况下,如果您输入

http://www.madeupsiteforexample.com/somethingmadeup

你先接收到一个302,然后是200。
我试图让它第一次抛出404代码并显示我设置的404页面(/FileNotFound.aspx)。
问题是要么显示404页面时返回200代码,要么当IIS看到404状态代码并显示其自己可怕的404页面而不是我自定义的页面时,IIS会接管。
我尝试使用模块、global.asax和在我的404页面的代码后端设置状态代码。所有结果都导致IIS接管。
这是我的Global.asax实现。
protected void Application_Error(object sender, EventArgs e)
{
    Response.TrySkipIisCustomErrors = true;
    Response.StatusCode = 404;
}

现在我通过Server.Transfer解决了这个问题。
然而,这会导致所有会话都为空,并且任何引用Session的代码都会引发异常。还有试图从资源文件中检索项目的代码会引发异常。
对于在IIS7中处理404错误的“正确方法”,您有任何建议或文章吗?
4个回答

3

0

如果你想让Session仍然可用,使用Server.TransferRequest(IIS6不支持)而不是Server.Transfer。

但我更喜欢在FileNotFound.aspx中调用Response.StatusCode = 404;并将web.config设置为:

<system.webServer>
  <httpErrors errorMode="Custom" existingResponse="Replace">
    <remove statusCode="404" subStatusCode="-1"/>
    <error statusCode="404" prefixLanguageFilePath="" path="/FileNotFound.aspx" responseMode="ExecuteURL"/>
  </httpErrors>
</system.webServer>

对于其他人,如果你和我一样只是在首页上显示一个顶部信息来处理404错误,那么你可以测试它是否为404请求,因为内部新的请求会将状态码添加到URL中,即:

if (Request.Url.ToString().Contains("?404;"))
{
    Response.StatusCode = 404;
    Util.DisplayMessage("The page you are looking for no longer exists. If you navigated to this page by clicking a link within this site please <a href='" + ResolveUrl("~/contact.aspx") + "'>contact us</a> to let us know.");
}

如果图像、脚本等的路径是相对于FileNotFound.aspx(即不是相对于站点根目录'/path'或在服务器上解析为'~/path'),并且缺少的页面(即当前URL)位于不同的文件夹中,则路径可能会出错。为了解决这个问题,我告诉浏览器使用基础标签将相对路径基于FileNotFound.aspx所在的位置,并告诉服务器使用Context.RewritePath进行匹配。

Page.Header.Controls.AddAt(0, new LiteralControl("<base href='" + Request.Url.Scheme + "://" + Request.Url.Authority + VirtualPathUtility.ToAbsolute("~/") + "'/>"));
Context.RewritePath("~/");

0

看看这个教程,通常通过配置而不是代码设置自定义错误页面。


1
这似乎是针对IIS6的说明? - WebDude

0

您可以通过修改“默认网站”(或特定于您的应用程序)下的“错误页面”设置来更改显示在404上的页面。


1
你能提供一个例子吗?这似乎仍然会使我的页面返回200状态代码,并且不能满足所有404请求。例如:www.site.com/idontexist;www.site.com/idontexist/;www.site.com/idontexist.aspx - WebDude

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接