ASP.NET自定义404错误页面返回302的HTTP状态码

10
在我的 asp.net 网站中,我已经在 web.config 文件中定义了自定义错误页面,如下所示。
<customErrors mode="On" defaultRedirect="~/defaulterror.htm" >
<error statusCode="404" redirect="~/404.htm" />

当文件未找到时,它会正确显示404.htm页面,但问题在于当我进行Fiddler跟踪时,它返回302作为HTTP状态代码。这对于搜索引擎页面索引来说是一个大问题,因为由于这个问题,最近有很多破损的链接仍然被索引到我的网站中。如何防止在文件未找到错误时返回302作为HTTP状态代码,并为文件未找到错误返回404。我正在使用asp.net 3.5。


1
请参考此帖子,这是一个使用ASP.Net MVC过滤器属性的自定义404错误页面解决方案的示例。该解决方案还避免了向浏览器发送302 / 200消息,而是向浏览器发送404响应。 - sky-dev
5个回答

20

在搜索引擎上查找此问题后,似乎这是微软ASP.NET为该情况提供的默认行为。这对于SEO非常不利。我发现的一个解决方法是检查请求的文件是否存在于HTTP处理程序中(或global.asax文件),或使用:

<customErrors mode="On" redirectMode="ResponseRewrite">
    <error statusCode="404" redirect="/FileNotFound.aspx" />
</customErrors>
如果请求的文件不存在,则将请求路径重写为未找到页面(如果使用HTTP处理程序或global.asax),在404错误页代码后面清除服务器错误,并手动向响应添加404错误标头,而不是等待服务器执行此操作。
Server.ClearError();
Response.Status = "404 Not Found";
Response.StatusCode = 404;

“redirectMode” 属性是在 .NET Framework 4.0 中加入的! - Petr Felzmann
这太完美了。URL 仍然停留在同一页,但现在我得到了正确的 404 状态码。 - kd7iwp
1
嘿,你能把这个例子补充完整吗?我不太懂。 - Furkan Gözükara
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - HBlackorby

3
在ASP.NET 4.0中,你可以使用redirectMode="ResponseRewrite"来发送美观的错误页面和正确的HTTP代码。

我不会称这些错误代码为“正确的”。使用它,未找到错误将导致HTTP状态码为200。 - Justin J Stark

0
如果您在404页面的代码后面添加以下内容,您将获得正确的结果 -
页面404.aspx
protected void Page_Load(object sender, EventArgs e)
{
    Response.StatusCode = 404;
}

0

正如您可能已经知道的那样,302响应用于通知调用者所请求的资源已被移动到不同的位置。

当您在Fiddler中看到返回302 http代码时,头部也会有“location”声明吗?例如:

HTTP/1.1 302 Found
Location: http://www.yoursite.com/somewhere/blah.htm

看起来您的Web服务器上可能有某些东西拦截了404返回并将其替换为302。虽然这不是很明确,但我建议您查看该站点的IIS配置。


-3

24
因此,在答案中包含解决方案的重要性(以及链接)变得更加重要——他们似乎不再有博客。 - James Skemp
这个网站有很多讽刺的地方:它是建立在ASP上的 <meta name="description" content="我们的网站已经更新,因此该页面不再存在..."> * <meta name="keywords" content="更新,因为,更长,找不到,"> * <meta property="og:title" content="Hebbink.com | Um website profissional por um preço accessível">(一个专业的网站,价格合理) - ᴠɪɴᴄᴇɴᴛ

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