站点做会员改版,未登录访问文章页返回 401 加登录框,CDN 把 401 页面缓存了,蜘蛛之后抓正文全是登录提示,索引量一周掉了三成。
一开始怀疑是「源站在灰度期间对蜘蛛也返回 401」,查了一圈,方向不对。
真正麻烦的地方在于,几个原因的现象几乎一样。401 页面被当成普通 HTML 缓存。还有一种是缓存键只看 URL,不看登录态。
少数情况下是清缓存后回源仍返回 401,形成循环。
先确认蜘蛛拿到的状态码
curl -s -o /dev/null -w "%{http_code}\n" -A Googlebot https://www.example.com/post-1/
再往下让 401 和 403 不进缓存
if ($status ~ "^(401|403)$") { add_header Cache-Control "no-store"; }
接着对蜘蛛放行公开文章
if ($http_user_agent ~* "Googlebot|bingbot") { set $auth_bypass 1; }
末了清掉已缓存的 401 页面
curl -X PURGE https://www.example.com/post-1/
改之前先确认了最近有没有人动过配置,避免白查一遍。
这次没动代码,只在配置和运行环境上找原因。
别只看报错消失,验证要多做一步。蜘蛛请求文章页返回 200,缓存里不再有 401 页面,索引量两周内回升。
登录页和错误页必须显式 no-store,默认缓存策略会把它们当成正文。报错文案容易误导,真正的原因往往在相邻那一层的日志里。
