投放 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 寫法统一好,只是让抓取更干净,並不意味着頁面就一定被收錄,收錄還取决于内容本身是否值得被索引。