很多站点在浏览器里看起来只有一個地址,但從抓取工具的角度看,同一份内容可能對應着好几套 URL:带 www 與不带 www 各一套,http 與 https 各一套,有的還带預設端口或測試子域。蜘蛛把每一套都当作獨立 URL 去發現和排队,抓取額度被摊薄,重复内容也更容易出現。這類問题不难查,但需要按顺序排查一遍。
常见的几種主机名變体
- 协议變体:http://example.com 與 https://example.com 都能打開,且都返回 200。
- 子域變体:www 與非 www 同时可訪問,頁面内容完全一致。
- 端口與調试域名:example.com:8080、test.example.com、staging 环境對外可訪問。
- 大小寫與尾随点:Example.com、example.com. 在某些服務器配置下也能返回 200。
- CDN 與源站域名:回源域名被搜尋引擎發現並抓取。
先確認到底有几個版本能返回 200
用几條命令就能看清楚。把下面几個地址依次請求一遍,重点看狀態碼和最终跳轉到的 URL:
- curl -I http://example.com
- curl -I https://example.com
- curl -I http://www.example.com
- curl -I https://www.example.com
如果四個都返回 200,說明存在四個可抓取的副本;如果返回 301 並指向同一個規范地址,那基本没問题。另外可以在服務器日誌里按 Host 字段統計,看看到底有多少個主机名在被真實抓取。
统一策略:只保留一個規范主机名
确定一個規范形式(例如 https://www.example.com),其余全部 301 過去。做法上注意几点:
- 用 301,不用 302 或 JS 跳轉。前端脚本跳轉和 meta refresh 對抓取工具来说往往只是頁面内容,主机名统一得不够明确。
- 跳轉要一步到位。http 跳到 https 再跳到 www 的两跳鏈路,尽量合並成一跳。
- 證书要覆盖全部變体。否則 http 版本能跳,https 的另一個變体却直接报错,抓取记錄里就會出現失敗項。
- 内鏈、站点地图、canonical 全部寫同一個主机名。這三處寫错,等于自己把蜘蛛引到非規范版本上。
容易被忽略的几個点
站点地图與 canonical 的一致性
站点地图里如果混着两種主机名,等于主動提交重复 URL。canonical 也建议自引用到規范主机名,別指向另一個版本。
測試环境不要暴露在公網
staging、dev、uat 這類子域如果没做訪問控制,被抓到之後可能長期留在索引里,清理起来比预防麻烦得多。
CDN 回源域名的處理
部分 CDN 會提供預設回源域名,如果它可以直接訪問且返回 200,最好在源站或 CDN 侧限制,只允许特定 Host 的請求。
主机名统一不是一次性工作。換證书、換 CDN、加子域的时候,都值得再跑一遍上面那四條 curl。
把這件事做干净,收益不是立刻多收錄多少頁,而是让抓取額度集中在一個規范地址上,服務器日誌里的抓取记錄也更容易看懂。