当访客访问网站不存在的页面地址时,IIS会返回404页面。这个默认的404页面对访客来说不够友好,我们通常会通过自定义404页面的方式,给展示一个友好的、个性化的404页面。


对于托管到.net Framework的动态页面,我们可以在web.config中配置customErrors节点,开启自定义错误页面。当用户访问不存在的页面时,都302跳转到我们指定的页面,如下:

<customErrors mode="On">
    <error statusCode="404" redirect="~/404.aspx"/>
</customErrors>

通过web.config设置,页面StatusCode为302,转向到指定页面StatusCode为200.png


对于未托管到.net Framework的静态页面,如.html/.shtml/.css/.js,甚至是不带后缀名的纯字母数字地址,都可以在IIS上设置。可参见博文《网址上输入不存在的文件夹名,暴露服务器磁盘路径,用404错误页设置解决》

通过IIS设置,页面StatusCode为200.png


而这些通过web.config中customErrors配置和IIS配置的方式,对于搜索引擎来说,和正常页面并没有什么区别。原因是通过web.config中customErrors配置的方式,浏览器先会进行302跳转到指定的404页面,此时响应的状态码(StatusCode)是302,跳转到指定404页面后响应状态码(StatusCode)为200。通过IIS配置的方式,响应状态码(StatusCode)是200。此时搜索引擎会将其视为正常的页面跳转和加载,蜘蛛爬虫不会停止抓取此页面。而搜索引擎收录很多链接地址都是同样的页面时,它会认为你是在玩弄它,然后对你的网站排名进行降级惩罚。


问题出来了,如何告知搜索引擎,这个自定义的错误页面,就是一个404页面呢?


1.在我们指定的这个404页面中加入代码,指定此页面的StatusCode就是404,在404.aspx的Page_Load事件中添加代码:

protected void Page_Load(object sender, EventArgs e)
{
    Response.StatusCode = 404; //指定此页面的StatusCode就是404
}

这样,在IIS设置的错误页后,在访问静态地址转向此页面时,服务器给的响应状态就是404

2.通过web.config中customErrors的方式,在访问不存在的页面时,会有一次302跳转,服务器会首先响应302状态,跳转到404页面之后再响应200状态,此时我们在Global.asax的Application_Error事件中硬性拦截:

void Application_Error(object sender, EventArgs e)
{
    HttpException error = Server.GetLastError() as HttpException;
    if (error != null)
    {
        var statusCode = error.GetHttpCode();
        if (statusCode == 404)
            Server.Transfer("/404.aspx");
    }
}

同样也执行第一步,在404.aspx的Page_Load事件中赋值状态码。

测试如下:

此时StatusCode是404了.png

此时StatusCode是404了2.png


服务器响应的StatusCode都是404了