先给结论:不要只看HTTP状态码。若错误页面返回200,应把“响应头状态”和“页面实际呈现的正文”当成两条独立证据链,分别抓取、分别比对,再决定是修状态码还是修内容。只盯一头,会把问题从一个页面扩散到整站。
两种做法都成立,但适用条件不同。第一种是错误页面本应返回4xx或5xx,却返回了200,此时要改的是状态码逻辑。第二种是页面本身是正常内容,只是模板里混入了错误提示文字,此时要改的是内容渲染,而不是状态码。判断依据在于:页面返回200时,正文究竟在说什么。
可区分的原因证据有三类。第一类,响应头是200,正文却出现“页面不存在”“系统错误”等字样,说明状态与内容矛盾。第二类,响应头是200,正文是正常商品或文章,但页面标题或面包屑写着错误页模板的名称,说明模板复用出错。第三类,响应头是200,正文为空或只有框架,说明渲染中断但状态没跟着变。
实施动作:用命令行抓取响应头,同时保存渲染后的正文文本,两者放在同一份记录里。若正文包含错误提示而状态是200,优先修状态码;若正文正常而模板文字错误,优先修内容。这个动作的结果决定下一步是改服务端路由,还是改前端模板,方向不同,代价也不同。
同服务器网站查询的麻烦在于,多个站点共享同一套服务端逻辑,一个站点的错误处理写错,可能让同一台服务器上的其他站点也返回200。所以核对时不能只查一个域名。
第一步,对目标URL抓取响应头,记录状态码、内容类型和重定向链。第二步,对同一URL抓取渲染后的正文,记录可见文字、页面标题和主要区块。第三步,把这两份记录逐条对照,标出“状态说成功、内容说失败”的条目。第四步,在同一台服务器的其他站点上重复前三步,看矛盾是否成片出现。
如果只有单个URL矛盾,通常是该路由或该模板的问题;如果同服务器多个站点同时矛盾,通常是共享的错误处理中间件或统一返回逻辑出了问题。这一步的区分直接影响修复范围:前者改一个点,后者要改公共层,回滚代价更大。
记录不需要复杂,但要能复查。可以按下面的字段保存,每个URL一行:
假设一个例子:某URL返回200,正文却显示“您访问的页面不存在”。把这条记录和同服务器另一个正常站点的记录并排看,如果后者也出现同样矛盾,说明公共返回逻辑需要检查;如果只有前者矛盾,说明该路由的错误分支没有正确设置状态码。这里的状态码与内容不一致是事实,不等于搜索引擎一定会怎样处理,也不等于抓取量或索引量会立刻变化,只能说明页面自身存在可核对的不一致。
有时状态码已经正确返回404,正文却是正常内容或空白。这类情况不能只靠状态码判断,因为用户和抓取工具看到的内容可能完全不同。此时要核对的是:返回404的页面是否提供了有效指引,比如返回首页或相关内容的链接;返回410的页面是否明确表示已移除。若状态正确但内容毫无帮助,仍应视为需要修复的内容问题。
另一个例外是软404:状态码是200,正文却接近空模板或只有导航。它不会因为状态码是200就变成正常页面。核对方法与前面一致,先抓正文,再判断内容是否具备独立价值。若正文确实为空,修内容比改状态码更优先,因为状态码改成404只是承认失败,并不能恢复页面价值。
修复动作完成后,不要只抽查一个URL。按原记录逐条重抓,重点看三件事:状态码是否与内容语义一致;同服务器其他站点是否仍存在同类矛盾;原先返回200的错误页是否已改为对应错误状态。若状态码改了但正文没改,矛盾仍在;若正文改了但状态码没改,矛盾也仍在。
最后一步是确认例外情况:如果站点使用robots.txt阻止抓取错误页,这不等于索引移除,也不等于问题解决。站点地图不保证收录,HTTPS也不保证页面内容与状态一致。核对一致性只能靠抓取记录本身,不能靠间接信号推断。把记录保留下来,下一次同服务器网站查询时,才能判断这是新问题还是旧问题复发。