一個頁面如果同时能通過好几種地址打開——http 的和 https 的、带 www 和不带 www 的、结尾带斜杠和不带的——對搜尋引擎来说,這就是几個不同的地址。蜘蛛自己不會判断哪個才算标准,它只會照着找到的連結去抓。如果服務器對每種形態都直接返回 200,抓取和權重就分散開了。
哪些地方最容易出現形態分歧
- 协议层:http 和 https 都能訪問,或者只有首頁跳轉、内頁没有跳。
- 主机名:example.com 與 www.example.com 都返回 200,没有互相收口。
- 目錄尾斜杠:/about 與 /about/ 都能打開,服務器不做归一。
- 大小寫:Linux 环境下 /About 與 /about 是两個真實路径,都能返回内容。
- 預設文件名:/index.html、/index.php 和根目錄 / 都能訪問到同一份内容。
- 端口号:某些环境下 https://example.com:443/ 也能被訪問到。
做一轮訪問測試,先看清現状
- 把首頁和几個内頁拿出来,用 https、http、带 www、不带 www、带斜杠、不带斜杠、大小寫變体分別訪問一遍。
- 记錄每個组合返回的狀態碼。理想情况是只有一種组合返回 200,其余全是 301 到那一個地址。
- 如果某個變体返回 200,說明服務器没有做收口,需要补規則。
- 再看服務器日誌,按 Host 字段統計搜尋引擎蜘蛛訪問时用的主机名。如果日誌里出現两種以上主机名,說明蜘蛛确實在两套地址之間跑。
统一要落到服務器层,而不是只寫在頁面里
頁面里的 canonical 只能算兜底提示,真正管用的收口動作是服務器返回 301。做法是把規范形態定下来,通常是 https 加一個固定主机名,其余所有變体都 301 到它。nginx 里通過 server_name 加 return 301 组合就能覆盖大部分情况,Apache 用 RewriteRule 也可以。
重定向不要串成一長串
常见問题是一次訪問要跳三四次:http 跳到 https,再跳到带 www,再补尾斜杠。每多一跳,抓取效率就低一点。規則要寫成一步到位,把协议、主机名、尾斜杠在同一條重定向里處理完。
内鏈和静態资源一起改
只改服務器規則、站内連結還寫着舊地址,蜘蛛每次進来都要多绕一跳。導航、面包屑、正文里的内鏈、Sitemap、RSS、图片和 CSS/JS 的引用路径,都要统一成規范形態。相對路径能避免一部分問题,但頁面模板里的绝對地址和硬编碼域名要逐個检查。
Sitemap 與 canonical 只保留一種寫法
Sitemap 里提交的 URL 應当全部是規范形態,不要混着舊域名。canonical 标簽也统一寫規范形態,作為頁面层的次級保險。
几個容易漏掉的细节
- 重定向的落点不能是 404 或另一個重定向,改版删頁时尤其容易出這個問题。
- CDN 或负载均衡层有自己的規則,源站改好了,邊缘节点可能還在返回 200,需要同步配置。
- HTTPS 頁面里如果還引用 http 的图片或脚本,浏览器會拦截加载,蜘蛛也可能拿不到這些资源。
- 證书過期會導致跳轉鏈断掉,可以用监控定期检查一下到期時間。
形態统一這件事,做完之後不會立刻看到什么變化,但没做的时候,後續所有關于抓取和收錄的分析都會失真——因為你连蜘蛛抓的是哪一個地址都不确定。