为啥在asp.net中使用自定义404页面时不存在的页面返回302状态

Posted

技术标签:

【中文标题】为啥在asp.net中使用自定义404页面时不存在的页面返回302状态【英文标题】:Why does a Non-existant page returns 302 status when using a custom 404 page in asp.net为什么在asp.net中使用自定义404页面时不存在的页面返回302状态 【发布时间】:2011-02-20 11:22:23 【问题描述】:

我设置了一个自定义 404 页面 custom404.aspx,它正确返回“404 Not Found”错误,但是最初请求的不存在页面返回“302 Found”状态。

所以当我测试这个pagedoesnotexist.aspx 时,它返回一个“302 Found”,然后custom404.aspx 加载并返回一个“404 Not Found”状态。

我想确保搜索蜘蛛/机器人了解所请求的页面不存在并且不应出现在任何搜索结果中。这个设置是否正确?

【问题讨论】:

【参考方案1】:

简单地说...

例如,使用:

/path_to_error_page.html 

...而不是...

http://www.example.com/path_to_error_page.html

原因是服务器解释了初始请求然后生成重定向到 404,因此您的客户端有效地获得了 2 个响应。

相对路径不会产生重定向,但内部服务器传输只会产生 1 个响应,即您想要的响应!!

这应该可以解决您的问题。

【讨论】:

目前我正在为 400 和 500 错误页面使用相对路径。【参考方案2】:

要回答上述问题,这就是自定义错误在 ASP.NET 中的工作方式。我见过一些例子(虽然我没有一个方便的例子),人们使用 HttpModules 来拦截错误,并为看起来不是机器人的用户提供自定义错误页面,并向看起来像的用户提供 404 响应成为机器人。

在不同的方向上,我不确定机器人是否会定期跟踪 302 响应。也许更相关的是,让您的错误页面(假设它可用)出现在搜索结果中真的很糟糕吗?至少用户有指向您网站的链接——这比让您的竞争对手网站出现要好...

【讨论】:

我认为获取蜘蛛索引的自定义 404 和 500 等错误页面是一件坏事。例如,谷歌会抹黑有太多错误消息的网站,【参考方案3】:

实际上,它很可能完全按照您在 web.config 中的配置工作。

取决于您使用的网络服务器(IIS 6/7)以及您用于配置 404 自定义页面的方式,但基本上这是重定向到自定义错误页面和执行它之间的区别!

目前您已将 asp.net / IIS 配置为重定向到错误页面。更改设置以执行页面,您将得到您正在寻找的内容:)

【讨论】:

您能说得更具体些吗?在 IIS 管理器/ASP 设置对话框中设置自定义错误页面时,这些更改将应用​​于 web.config。您是否建议我拦截 global.asax 中的错误并使用 Server.Execute("/path-to-error-page") 并在 web.config 中禁用自定义 500 错误消息?【参考方案4】:

我已经找到了解决方案:

在您的 web.config 中输入“redirectMode=ResponseRewrite”:

<customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="~/errors/GeneralError.aspx">
            <error statusCode="404" redirect="~/errors/PageNotFound.aspx" />
        </customErrors>

...然后在 Page_Load 中的自定义 404 页面中放入:this.Response.Status = "404 Not Found";

瞧!

【讨论】:

当我将redirectMode=ResponseRewrite 添加到customErrors 时,我看到了来自服务器的正确且唯一的响应,代码为404。那么我们真的需要在Page_Load 中另外设置Reponse.Status 吗?

以上是关于为啥在asp.net中使用自定义404页面时不存在的页面返回302状态的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET自定义404和500错误页面

旧 ASP.Net 应用程序中的自定义错误页面不起作用

URL 中的 ASP.NET aspxerrorpath

Google 404 和 .NET 自定义错误页面

Asp.Net Web API 阻止 404 页面上的任意文本

MVC6 中的自定义选择性 404 页面