什么是404错误
HTTP 404 错误意味着链接指向的网页不存在,即原始网页的URL失效,这种情况经常会发生,很难避免,比如说:网页URL生成规则改变、网页文件更名或移动位置、导入链接拼写错误等,导致原来的URL地址无法访问;当Web 服务器接到类似请求时,会返回一个404 状态码,告诉浏览器要请求的资源并不存在。但是,Web服务器默认的404错误页面,无论Apache还是IIS,均十分简陋、呆板且对用户不友好,无法给用户提供必要的信息以获取更多线索,无疑这会造成用户的流失。
404页面的作用
搜索引擎通过HTTP状态码来识别网页的状态。当搜索引擎获得了一个错误链接时,网站应该返回404状态码,告诉搜索引擎放弃对该链接的索引。而如果返回200或302状态码,搜索引擎就会为该链接建立索引,这导致大量不同的链接指向了相同的网页内容。结果是,搜索引擎对该网站的信任度大幅降低。
如何检查自定义404页面能够返回“404”状态码
在自定义404错误页面设置完毕后,一定要检查一下其是不是能够正确地返回“404”状态码。检查的方法也相当简单,输入一个网站内不存在网页的url,查看一下HTTP Header的返回情况,确信其返回的是“404”状态码。测试状态码网址:http://www.mjjer.com/gethttpheader.php
问题:
我们都知道web.config里面有一个customErrors,我们通常设置的代码为:
<customErrors defaultRedirect="error.aspx" mode="RemoteOnly">
<error statusCode="404" redirect="404.aspx" />
</customErrors>
它的工作是这样的,当访问到一个不存在的地址后,返回的是一个302状态码重定向到404.aspx页面,网上搜了一阵几乎是千篇一律的讲在webconfig文件里写customErrors 使用redirect跳转到我自定义的页面404.aspx。但是实际测试发现用这个方法返回的是一个302状态码,而不是404。这样就可能导致爬虫认为这个页面仍然是有效的,只是链接错了,然后收录这个自定义的404页面。但它抓取了很多这样的页面之后发现这些页面都是一样的,认为你在玩它,于是会给你惩罚。
还有文章提到说在404.aspx的页面后台代码中返回404状态码
代码是在pageload中加入
response.statuscode=404;
这样做会在redirect返回302状态之后跳转到404.aspx,接着返回404。这样做理论上来说应该是有效的,因为爬虫遇到404就停止抓取。那么这个页面也不会被抓取。可还不够好,这种做法要求自定义404页面是一个动态页面,否则就没法返回404状态码。
解决:
发现还是有极少数的人发现了这个返回302的问题。他想出不在webconfig中使用customErrors而是直接在global.asax中返回状态码404,然后通过输出html方式输出一个自定义的404页面。当然这个页面本身是不存在的。但是这样做似乎有点硬编码的意思了。根据他的思路,我想到能不能在global.asax中做点什么。
网上找了另一段捕获http错误的代码,贴在Application_Error事件中:
// 在出现未处理的错误时运行的代码
Exception error = Server.GetLastError();
if (error != null && error is HttpException)
{
HttpException httpError = (HttpException)error;
// 如果是Http错误,则设置响应的HttpCode
int httpCode = httpError.GetHttpCode();
Response.StatusCode = httpCode;
//这样就能返回原始错误的状态码,然后用判断状态码来跳转到我指定的页面
Server.Transfer(Response.StatusCode == 404 ? "/404.aspx" : "/error.aspx");
}
经测试成功,除了404没有返回其他状态码,并成功跳转到自定义页,地址栏url不变,当你使用google的增强型404页面的时候可以让它获取正确的搜索提示。(google这个增强型404貌似不支持ie啊)。
另外还有一点看来是很重要的:
如果404页面大小不够521字节的话会被ie的默认内容替换。不止ie,chrome貌似也会这么做,被他的增强型404。。。其他浏览器未测试。
附:IIS自定义404页面不起作用的解决办法