常见問题

入口頁按 UA 给搜尋蜘蛛返回不同内容,會带来哪些問题?

入口頁通過 User-Agent 判断,给搜尋蜘蛛和普通訪客返回不同的 HTML,是蜘蛛池里常见但容易出問题的做法。本文說明它的几種常见形態、對 URL 發現和抓取的實际影响,以及更稳妥的替代做法和自查清單。

常见問题

入口頁按 UA 给搜尋蜘蛛返回不同内容,會带来哪些問题?

先弄清楚“按 UA 差异化返回”指什么

很多站点在做入口頁时,會在服務端或 CDN 邊缘节点判断 User-Agent:如果 UA 里出現 spider、bot、baidu、googlebot 之類的字样,就返回一份“纯連結版”頁面;普通訪客訪問时,則返回带样式、带脚本、带广告的正常頁面。這種做法通常被叫作差异化返回,也叫 UA 判断。

從 URL 發現的角度看,它确實能在短期内把連結集中暴露给搜尋蜘蛛。但代價是:同一份 HTML 不再存在,排查問题时你很难复現蜘蛛到底看到了什么。

常见的几種做法,各自的問题

  • 给蜘蛛返回完全不同的 HTML:這是最容易被判定為伪装(cloaking)的一類。搜尋引擎明确反對向爬虫和用戶提供實质上不同的内容,一旦被识別,受影响的可能不只是入口頁。
  • 只做小幅度裁剪:比如给蜘蛛去掉統計脚本、去掉彈窗。這種差异相對温和,但依然會造成“蜘蛛看到的頁面结构 ≠ 用戶看到的頁面结构”,後續調试連結是否生效會變得很麻烦。
  • 给蜘蛛返回 403 或空白頁:有些防護規則會把異常高频的 UA 直接拦掉,结果蜘蛛拿到的是一段驗證頁或错誤頁。抓取记錄顯示失敗,連結自然也發現不了。
  • CDN 缓存把两版内容串了:如果缓存键里没有 UA,蜘蛛請求触發生成的“蜘蛛版”可能被缓存下来,之後普通訪客也會看到,反之亦然。出現“頁面时好时坏”时,先查這一條。

對搜尋抓取和 URL 發現的真實影响

搜尋蜘蛛發現連結,靠的是它實际拿到的那份 HTML。如果那份 HTML 里的連結结构和你平时測試的頁面不一样,就很容易出現两種情况:一是你以為加了連結,蜘蛛那邊其實没有;二是蜘蛛看到的連結指向了你不希望被發現的參數版 URL。

更麻烦的是可维護性。差异化返回通常寫在中間件、Nginx 配置或邊缘函數里,時間一長没人记得規則细节。当你發現某個目标 URL 長期停在“已發現未抓取”时,很难判断到底是連結没被解析出来,還是被別的規則挡住了。

判断标准很简單:把 UA 換成搜尋蜘蛛的字符串請求一次,把返回的 HTML 存下来,看里面的連結是不是你真正想暴露的那一批。如果两者對不上,就先解决一致性問题,再谈抓取频次。

更稳妥的做法

  1. 尽量用同一份 HTML 服務所有訪問者,让連結在無 JavaScript 环境下也能被解析到。
  2. 需要区分蜘蛛和真實流量时,用日誌和統計去做分析,而不是用内容去区分。
  3. 如果确實要做 UA 判断,至少保證連結结构、主要正文和狀態碼保持一致,只做样式或脚本层面的裁剪。
  4. 检查 Vary 头和 CDN 缓存键,確認两個版本不會互相污染。

自查清單

  • 用普通 UA 和蜘蛛 UA 各請求一次入口頁,對比返回的 HTML 與狀態碼。
  • 看响應头里有没有 Vary: User-Agent,缓存策略是否與之匹配。
  • 關掉 JavaScript,確認頁面里仍然能看到目标連結。
  • 翻一遍最近的蜘蛛訪問日誌,看入口頁返回碼是否稳定在 200。

差异化的内容返回解决不了收錄問题,它只會让“蜘蛛到底看到了什么”變得不可控。對大多數站点来说,把入口頁做成结构简單、連結稳定、返回碼正常的頁面,比花心思做 UA 判断更划算。