一个页面如果同时能通过好几种地址打开——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 的图片或脚本,浏览器会拦截加载,蜘蛛也可能拿不到这些资源。
- 证书过期会导致跳转链断掉,可以用监控定期检查一下到期时间。
形态统一这件事,做完之后不会立刻看到什么变化,但没做的时候,后续所有关于抓取和收录的分析都会失真——因为你连蜘蛛抓的是哪一个地址都不确定。