蜘蛛池入口页的任务是让搜索蜘蛛稳定地发现链接、顺着链接往下走。但很多人忽略了:蜘蛛每一次抓取,都是一个没有身份的陌生访客——它不带 Cookie、不维持会话,也不会点击“同意”按钮。入口页如果依赖这些状态,蜘蛛看到的页面可能和你用浏览器看到的不一样。
蜘蛛访问时不携带什么
主流搜索引擎的抓取程序在多数情况下不会保留上一次访问的 Cookie,也不会执行登录、勾选偏好这类操作。这意味着:
- 依赖 Session 判断“是否已访问过”的分流逻辑,对蜘蛛基本无效;
- 需要点击“接受 Cookie 政策”才展开的正文或链接,蜘蛛很可能看不到;
- 把链接清单放在“最近浏览”“猜你喜欢”这类个性化模块里,蜘蛛拿不到;
- 前端根据 Cookie 做 A/B 测试,蜘蛛可能一直落在同一个版本,甚至落到空版本。
三个连锁反应
1. 会话与个性化模块被掐断
入口页最核心的东西是链接。如果模板把这些链接放进需要状态才渲染的模块,蜘蛛抓到的就是一具没有出口的骨架。稳妥的做法是把主要链接放在首屏的静态 HTML 里,个性化模块只作为补充,而不是唯一入口。
2. 基于 IP 或地域的跳转
不少入口页会根据访问者 IP 做地域跳转,比如把海外 IP 导到一个“全球版”页面。蜘蛛的出口 IP 和你所在地往往不同,它可能被跳到一个内容与链接都不同的版本,甚至跳进循环。若要做地域分流,至少保证不同版本的核心链接结构一致。
3. 缓存层的 Vary: Cookie
如果响应头里带着 Vary: Cookie,缓存会把每个不同 Cookie 的请求都当作独立版本,命中率下降、回源变多,服务器更容易变慢;对蜘蛛而言,它每次拿到的版本也可能不稳定。入口页是给蜘蛛看的“公告栏”,内容应当尽量与访客状态无关。
调整顺序:先保证默认状态可读
- 用无痕窗口或自定义 UA 抓取入口页,对比正常浏览器的返回结果;
- 关闭 JavaScript,看首屏还剩多少可点击的链接;
- 清掉 Cookie 再抓一次,确认页面没有因为缺少会话而少内容;
- 检查缓存与 CDN 的缓存键规则,避免把 Cookie、UA 混进键里;
- 把“同意条款”“登录提示”这类遮挡层,做成不阻断 HTML 输出的形式。
日志里能看到什么
在服务器日志中,可以对比同一入口页在蜘蛛 UA 与普通浏览器 UA 下的响应体大小和状态码。如果蜘蛛请求返回的体量明显偏小,或者状态码是 302,又或者返回 200 但内容偏短,多半就是状态相关逻辑在起作用。观察周期建议按周看,不要凭单次抓取下结论。
不建议给蜘蛛做特殊处理
针对蜘蛛 UA 返回一套完全不同的内容,短期也许能看到抓取上的变化,但模板差异过大时可能被判定为伪装,反而让入口页失去信任。更稳妥的做法是让默认版本本身就对蜘蛛友好:链接在 HTML 里、跳转链短、缓存规则简单。真要做区分,也尽量控制在同一套模板的细微差异内,比如是否展示个性化推荐位。
提示:蜘蛛不带 Cookie 这件事本身不是问题,问题是你把“必须带状态才能看到的内容”当成了唯一入口。把默认状态下的页面做好,比针对蜘蛛做特殊处理更省事,也更稳。