投放 URL 的时候,很多人是按手里的表格或程序输出来填的,同一个页面在不同地方可能被写成好几种样子:有的带 # 锚点,有的路径大小写不一样,有的参数顺序反了,有的末尾多一个斜杠。这些写法在浏览器里看着都能打开,但在搜索蜘蛛那边,未必是同一条链接。
搜索蜘蛛看到的是服务器真正收到的那个 URL
地址栏里 # 后面的部分叫片段标识符,它不会随请求发给服务器。你在浏览器里访问 /page#section2,服务器实际收到的仍然是 /page。搜索蜘蛛也一样,通常不会把 # 后面的内容当作请求的一部分,因此 /page#a 和 /page#b 大概率只算一条链接,不会因为锚点不同就多抓一次。
片段标识符主要影响页面内的跳转定位,不是用来生成新 URL 的。指望靠加不同锚点让页面被多发现几次,基本不会有效果。
哪些差异通常被忽略,哪些会被当成新链接
一般会被合并或忽略的
- # 锚点及其后面的全部内容
- 域名部分的大小写,EXAMPLE.COM 与 example.com 是等价的
- 默认端口,即 80 和 443 一般可省略
- 协议 http 与 https,在服务器做了跳转的情况下通常会被归并到一处
通常会被当成不同 URL 的
- 路径大小写:/Page 与 /page 在多数 Linux 服务器上是两个独立地址
- 查询参数顺序:?a=1&b=2 与 ?b=2&a=1 一般视为不同 URL
- 空参数:?a=1 与 ?a=1&b= 在很多系统里算两条
- 末尾斜杠:/page 与 /page/ 是否算两条,取决于服务器和程序路由怎么处理
- 无意义的跟踪参数被反复拼接出来的变体
要注意,末尾斜杠这一项没有统一答案。有的站点两种写法都返回 200 且内容相同,有的会 301 到其中一种,有的直接 404。不能一概而论,最好在自己的环境里实际测一下。
这件事对蜘蛛池投放的影响
抓取预算是有限的。同一条内容如果有五六种写法,搜索蜘蛛可能把这些变体分别排队、分别抓取,真正需要被发现的新 URL 反而排在后面。入口页面上能承受的链接数量是有限的,把位置让给重复地址,等于减少了有效 URL 的曝光机会。
更麻烦的是,如果这些变体都返回 200 且内容一致,容易形成重复内容,给收录选择带来干扰:到底哪一条是主版本,由谁来决定,往往不清晰。日志里同一路径的抓取被拆成好几份,也不利于判断抓取是否正常。
投放前可以做的几件事
- 统一写法规范:路径统一小写,去掉无意义参数,末尾斜杠统一保留或统一去掉,站内链接和投放链接用同一套规则。
- 用 canonical 指定主版本:让变体页面明确指向主 URL,减少判断上的歧义。
- 在服务器层面做 301:把 /Page 转到 /page,把 http 转到 https,把带斜杠的变体转到不带斜杠的版本。
- 后台参数处理:对排序、筛选、跟踪类参数,如果确实不需要被单独抓取,用 robots.txt 或参数处理工具做收敛,而不是放任它们生成新地址。
- 日志抽样核对:挑几条路径,看看大小写变体、参数顺序变体是否都出现在日志里。出现得多,说明收敛工作还不够。
几个常见的误区
- 以为多写几个带不同参数的 URL 就能“多被发现几次”,实际上多半只是浪费抓取预算。
- 以为 # 锚点会让页面变成新 URL。
- 以为大小写无所谓,只要服务器返回 200 就没问题。返回 200 恰恰是问题所在,因为它没有把变体收敛掉。
可以先把一批投放 URL 整理一遍,观察日志里变体抓取是否减少,再决定要不要扩大范围。需要说明的是,把 URL 写法统一好,只是让抓取更干净,并不意味着页面就一定被收录,收录还取决于内容本身是否值得被索引。