【总结】customErrors无用,自定义页面真正返回的是404状态码
2011-08-25 11:08
99 查看
什么是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页面不起作用的解决办法
在IIS里自定义了404错误页,但是怎么也不显示,还是原来的默认404页,查了下资料,解决了,要给404页如404.htm加上权限IIS_WPG只读,这样就可以了。
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页面不起作用的解决办法
在IIS里自定义了404错误页,但是怎么也不显示,还是原来的默认404页,查了下资料,解决了,要给404页如404.htm加上权限IIS_WPG只读,这样就可以了。
相关文章推荐
- Nginx自定义404错误页面,返回200状态码,非404状态码解决!
- Nginx中定义404页面并且返回404状态码的正确方法
- ASP.NET MVC WebApi 返回数据类型序列化控制(json,xml) 用javascript在客户端删除某一个cookie键值对 input点击链接另一个页面,各种操作。 C# 往线程里传参数的方法总结 TCP/IP 协议 用C#+Selenium+ChromeDriver 生成我的咕咚跑步路线地图 (转)值得学习百度开源70+项目
- cas自定义返回登录页面信息
- 实用 打开窗口页面并返回值 整理总结
- CAS自定义登录默认页面和返回更多的参数以及自定义密码校验
- ASP.NET返回上一页面实现方法总结
- 你的程序404页面没有返回404头部?一句PHP即可帮你返回404状态码
- Ecology7二次开发:自定义浏览按钮自定义页面设置返回值
- ASP.NET返回上一页面实现方法总结(转载)-asp.net关注
- 页面返回顶部的方法总结
- jQuery中页面返回顶部的方法总结
- 工作总结 页面 ActionResult / JsonResult 将对象以 Json() 返回
- 【CAS】自定义登录页面,返回更多信息
- IIS下自定义404页面返回200状态码的严重性及解决方法
- [转载]针对IIS7以上的ASP.NET网站自定义错误页面与异常日志总结
- 实用 打开窗口页面并返回值 整理总结
- Hibernate执行自定义sql 返回一个list展示在页面
- Spring mvc 接受页面数据 和 返回页面数据 方法 总结