这是一个血淋淋的教训,这么说一点也不过分。因为最近发生了一个重大问题,网站流量大幅下跌,跌了近80%了。由于事件发生之前做过一些工作,加了大量友链,而且外站权重都相当高,在那天还发生了一次挂马事件,当然也即时解决了。还做了其它一些关键字内、外链优化等等。这样使得查找问题的原因就变的难上加难。偶然的原因发现,百度收录的链接开始出现错误,由于网站URL方式采用的目录式结构,最后一个字符都是/,然而百度收录的页面却无缘无故把这个线去掉了,而这种访问方式,我并没有做兼容。当时也查看了网站页面上的重写结果,没有发现哪里页面的链接出现过这种错误,那么百度里收录的这些页面从何而来?真的不得而知了。可能是外链里有些地址把那个目录后的斜线去掉了?不管它怎么收录的了,尽快做了一下兼容性工作,因为那种错误链接会被转到404页面上去。刚刚又查了一下,发现了一点蹊跷。
以下摘自百度百科:
自定义404错误页面是增强用户体验的很好的做法,但在应用过程中往往并未注意到对搜索引擎的影响,譬如:错误的服务器端配置导致返回“200”状态码或自定义404错误页面使用Meta Refresh导致返回“302”状态码。正确设置的自定义404错误页面,不仅应当能够正确地显示,同时,应该返回“404”错误代码,而不是 “200”或“302”。虽然对访问的用户而言,HTTP状态码究竟是“404”还是“200”来说并没有什么区别,但对搜索引擎这则是相当重要的。
而恰恰我发现这里服务器上nginx里404的配置就有这样一个问题,访问到无效地址的时候,跳转到的404页面返回状态码是200,汗了。怎么会这样?
一个等号引发的血案
最后发现问题的原因是配置里多余的一个“=”导致的这个状态码错误。
现在网上大多数nginx的404配置写法还是error_page 404 = /404.html; 注意这是个错误的写法,正确的写法是没有这个等号的,就是由于这个等号的指引让nginx将404的的错误进入链接都以200正常状态码显示了自定义的404页面,而这对普通用户来说看上去无差异,然而给搜索引擎发出的信号却是致命的。切忌切忌。因为此前的服务器,我一直都是用apache来做的,也是第一次遇到这个问题。改完后用工具检查一下,已经正常了。
其实这个错误如果更好的利用起来的话,还可以将错就错,也是跟业内人交流得知的,当然这就是一个偏门左道的事了,不在这里教坏大家。当然如果外链流量小,或者没有大流量的错误链接流入的话,这个也就不成立了。
最后可以通过这个工具进行检测:
http://www.seochat.com/seo-tools/check-server-headers/
输入一个你网站下的错误的路径,检测出有“HTTP/1.1 404 Not Found”就可以了。
或者使用下面的方法检查更方便,在命令行下输入: