zoukankan      html  css  js  c++  java
  • 【总结】customErrors无用,自定义页面真正返回的是404状态码

    什么是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只读,这样就可以了。
  • 相关阅读:
    RPC的入门
    Https的实现原理
    Celery
    Flask信号
    Redis安装
    python之递归
    python之三元表达式和生成式
    python第十八天作业
    python之生成器
    python之迭代器
  • 原文地址:https://www.cnblogs.com/SALIN/p/2152991.html
Copyright © 2011-2022 走看看