UA 差异化说的是什么
入口頁的服務器在响應請求前,會先讀一次請求头里的 User-Agent。根據這個字段,它可以决定返回哪一份 HTML:给搜尋引擎蜘蛛一個精简版,给普通浏览器一個完整体;给移動端一套模板,给桌面端另一套。這件事本身不新鲜,很多正常站点也在做。
但在蜘蛛池场景里,這個操作经常被用過头——從“给蜘蛛省点流量”滑向“给蜘蛛看点別人看不到的東西”。两者之間隔着的,就是常说的 cloaking。
為什么會有人這么做
- 蜘蛛只讀源碼,不执行复杂交互。给一份去掉广告位、去重脚本的轻量 HTML,能让它更快讀到正文和連結。
- 用戶端需要完整体驗:图片、视频、交互组件,這些東西對蜘蛛来说是负担,對人是必需。
- 不同蜘蛛的抓取能力有差异,有的能處理 JS,有的只認原始 HTML,分開返回可以减少讀取失敗。
- 入口站數量多、模板统一,用 UA 分流比维護多套站点省事。
風險落在哪一步
搜尋引擎對 cloaking 的定义並不看“是否用了 UA 判断”,而看返回内容是否存在實质差异。判断條件寫在代碼里不是問题,問题是两個版本差了多遠。
- 如果蜘蛛版的主题、正文、主要連結在用戶版里找不到,就属于内容层差异,風險很高。
- 如果只给蜘蛛版塞關鍵詞、塞隐藏連結,等于把作弊信号直接递到审查面前。
- UA 是可以伪造的。只要有人用同样的 UA 請求一次,两版差异立刻暴露。
- 判断逻辑寫死、没有開關,出問题後很难快速回滚。
哪些差异可以接受,哪些要避開
把差异分成两层看會清楚很多。
- 表現层差异:压缩体积、去掉广告脚本、图片懒加载降級、WebP 回退成 JPG、按地区返回語言版本、强制 HTTPS 跳轉、返回 301/404/410 這類狀態碼。這些属于正常工程手段。
- 内容层差异:标题不同、正文主体不同、關鍵詞不同、只给蜘蛛看的連結、给用戶返回空白頁或纯跳轉頁。這些属于红线,不建议碰。
判断标准可以简化成一句话:用戶通過同样的 URL 直接訪問,能不能看到蜘蛛看到的那份内容。如果答案是否定的,差异化就已经越界了。
如果确實要做,怎么落地更稳
- 核心内容保持一致。标题、正文主体、指向目标頁的主要連結,两個版本都要有。
- 差异只放在表現层:体积、格式、加载顺序、非關键资源的取舍,不動信息本身。
- 判断條件可复現、可關閉,留一個配置開關,出問题能马上退回统一版本。
- UA 不是唯一依據。主流搜尋引擎都提供反向 DNS 驗證方式,條件允许时结合 IP 段與 rDNS 一起判断,比單纯匹配字符串可靠。
- 用服務器日誌驗證實际效果:蜘蛛拿到的是哪一版、狀態碼是什么、响應体积多大、耗时多少,都要能查到。
- 頁面更新後两個版本同步改,避免蜘蛛版停留在舊内容上,導致目标頁連結失效。
几個常见的認知誤区
- “蜘蛛看到的就是用戶看到的頁面。”實际上蜘蛛讀到的是源碼,渲染後的画面它未必看得到,所以拿浏览器截图去判断入口頁效果是没意义的。
- “只要按 UA 分流就會被罚。”分流本身很常见,問题在差异幅度,不在技術手段。
- “给蜘蛛一份简化版是優化,给用戶一份完整版是体驗。”方向没错,但简化不等于删掉正文和連結。
- “缓存不會捣乱。”CDN 或反向代理的缓存键如果没有把 UA 算進去,很可能把蜘蛛版回给用戶,或者把用戶版回给蜘蛛,两邊都受影响。
小结
UA 差异化的合理用法,是让蜘蛛更顺畅地讀到真實存在的内容,而不是讀到一份用戶拿不到的内容。抓取優化解决的是“讀不到、讀得慢、讀一半就走”的問题,内容本身该有的東西,两個版本都得有。把這個邊界守住,差异化管理可以作為工程手段長期用;一旦跨到内容层,短期可能看不出問题,但排查起来會非常被動。