一个页面,理论上应该只有一个地址。但在实际站点里,同一个页面往往能出现好几种写法:带尾斜杠和不带尾斜杠、大写小写混用、URL 后面挂着一长串参数。站内不同位置链接写法不一致时,蜘蛛看到的可能就是几个看起来不同的地址。
一个页面变成多个地址,通常出在哪儿
- 结尾斜杠:/about 和 /about/ 是不是同一个页面,取决于服务器怎么处理。两边都能正常返回内容时,客观上就是两个地址。
- 大小写:/News 和 /news 在多数服务器上是不同的路径,即使它们渲染出同一个页面。
- 跟踪参数:utm_source、utm_medium、fbclid、gclid 这类参数,每分享一次就可能生成一串新地址。
- 会话与筛选参数:sid、sort、page、filter 这类参数,用户点几下就能组合出大量变体。
- 编码差异:中文路径、空格、特殊符号会被编码成百分号形式,不同地方编码方式不一致时,地址也会不同。
- 内链写法不统一:导航用绝对地址、正文用手写相对地址,同一个页面被链成了好几种写法。
多地址会带来哪些实际问题
- 抓取被分散:蜘蛛可能把有限的时间花在同一份内容的不同地址上,真正需要被抓的新页面反而排到后面。
- 信号分散:外链、内链、点击分别落在不同地址上,判断哪个是主版本时依据会被削弱。
- 重复内容:同一份内容以多个地址进入索引,索引要自己挑一份留下来,挑中的不一定是你在意的那份。
- 数据对不上:核对收录覆盖率时,同一个页面临时被算成好几条,数字会失真。
处理顺序:先统一站内,再处理外部
站内链接是最容易控制的一环,把这一环做干净,后面的事会简单很多。
- 定一套规则:是否带尾斜杠、路径是否统一小写、哪些参数允许保留,写进开发规范。
- 站内所有链接按规则生成:导航、面包屑、正文、站点地图、分页,同一页面只出现一种写法。
- 服务器层面统一:把不规范的写法 301 到规范地址,而不是让两边都能打开。
- 在页面里用 canonical 指明主版本,作为兜底,而不是唯一手段。
canonical 是一个提示,不是强制指令。它能帮助判断主版本,但不等于服务器重定向,两者不能互相替代。
跟踪参数和筛选参数怎么处理
跟踪参数往往是外部带进来的,站点控制不了别人怎么分享,但可以控制自己的响应方式:页面里的 canonical 指向不带参数的版本;对外分享统一使用干净地址;纯筛选、纯排序类参数,可以考虑在 robots.txt 里限制抓取。
这里有一个常见误解需要说清楚:限制抓取不等于该地址不会出现在索引里。如果别处有链接指向它,索引仍可能只凭链接信息把它收录进来,只是内容片段会比较粗糙。所以 robots.txt 更适合当作减少抓取浪费的手段,而不是去重手段。
几个容易忽略的细节
- 换框架或改版后路由规则变了,旧写法可能没配重定向,直接变成 404 或另一个页面。
- 站点地图里给出的地址要和站内链接写法一致,否则等于自己制造了两套地址。
- 搜索框生成的站内搜索结果页,通常不适合进入索引,需要有明确处理方式。
- 中文 URL 建议统一编码形式,避免同一路径出现两种百分号写法。
自检可以从这几件事开始
- 随机挑几个页面,用不同方式访问(加不加尾斜杠、改大小写),看服务器怎么响应。
- 用抓取工具拉一遍全站内链,看同一个页面是否存在多种写法。
- 核对站点地图与实际链接是否一致。
- 检查 canonical 是否指向真正对外的主版本,而不是另一个变体。
- 看服务器日志里带参数的请求占比,判断参数变体有没有在被大量抓取。
URL 规范化不是一次性工作,更像一条需要长期维持的规则。站点结构越复杂、上下游改动越频繁,越容易重新长出不一致的地址。把规则写进模板和发布流程,比事后一个个补重定向要省事得多。