【问题标题】:IIS7 404 errorsIIS7 404 错误
【发布时间】:2011-07-04 04:44:42
【问题描述】:

我有一个在 IIS 7 中运行的 ASP.NET 3.5 站点
我正在尝试让 404 第一次抛出 404 状态代码。

目前如果你输入

http://www.madeupsiteforexample.com/somethingmadeup

您收到 302,然后是 200。
我试图让它第一次抛出 404 代码并显示我设置的 404 页面(/FileNotFound.aspx)

我遇到的问题是 404 页面显示为 200 代码,或者 IIS 在看到 404 状态代码并显示自己可怕的 404 页面而不是我自定义创建的页面时接管。

我尝试使用模块 global.asax 并在我的 404 页面后面的代码上设置状态代码。所有这些都会导致 IIS 接管。

这是我的 Global.asax 实现

protected void Application_Error(object sender, EventArgs e)
{
    Response.TrySkipIisCustomErrors = true;
    Response.StatusCode = 404;
}

现在我确实通过 Server.Transferring 我的请求解决了这个问题。
但是,这会导致所有会话为空,并且任何引用 Session 的代码都会导致异常。尝试从资源文件中检索项目的代码也会导致异常。

关于在 IIS7 中执行 404 的“正确方法”有什么建议或文章吗?

【问题讨论】:

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


    【解决方案1】:

    我在 iis 7 上也遇到了这个问题。你可以试试这个,因为它对我有用……

    <httpErrors existingResponse="PassThrough" />

    这个人也和你有同样的问题。 IIS7 Overrides customErrors when setting Response.StatusCode?

    这是对正在发生的事情的补偿http://www.fidelitydesign.net/?p=21

    【讨论】:

      【解决方案2】:

      看看这个tutorial,通过配置而不是代码来设置自定义错误页面是正常的。

      【讨论】:

      • 这些似乎是 IIS6 的说明?
      【解决方案3】:

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

      【讨论】:

      • 你能提供一个例子吗?这似乎仍然使我的页面返回 200 状态代码并且不能满足所有 404 请求。即 www.site.com/idontexist ; www.site.com/idontexist/; www.site.com/idontexist.aspx
      【解决方案4】:

      如果您希望 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("~/");
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-22
        • 1970-01-01
        • 1970-01-01
        • 2011-06-13
        相关资源
        最近更新 更多