这个坑值得记一笔。日志里大量抓取只有请求头没有响应体,状态码 405,页面在浏览器里完全正常,收录却一直上不去。
真正麻烦的地方在于,几个原因的现象几乎一样。安全规则只放行了 GET,HEAD 被当成异常方法拒绝;部分 CDN 节点不支持 HEAD 回源,直接返回 405;应用层路由没有实现 HEAD,框架默认不允许该方法。
模拟蜘蛛发一个 HEAD 请求
curl -sI https://www.example.com/article-1
然后在 Nginx 里把 HEAD 转成 GET 处理
error_page 405 =200 $uri;
剩下的就是确认普通 GET 与 HEAD 返回一致
curl -s -o /dev/null -w '%{http_code} %{size_download}' https://www.example.com/article-1
中途换过一次思路,把范围缩到最小的那一层,反而快了。
中间停过一次,把已经改的东西回滚干净,再重新来一遍。
改完先别撤,确认这几项。HEAD 请求返回 200 且头部字段完整,日志里不再出现 405 状态,抓取到的页面数量明显回升,收录速度也恢复正常。
这里还有个坑。HEAD 不返回响应体是正常的,但状态码必须和 GET 一致,否则蜘蛛会认为这个地址不可用而降低抓取。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。