URL 是爬虫進入頁面的入口。字符寫法不统一,同一個頁面就可能以多個地址被抓取,也可能直接抓不到。中文、空格、大寫字母、尾斜杠這些细节,在浏览器里几乎看不出来,在日誌和索引里却會放大成重复地址和抓取浪費。
一、URL 里常见的四類字符問题
中文和空格
在地址栏輸入中文或空格,提交时會自動轉成百分号编碼。問题在于,分享出去的連結可能保留原文形式,也可能已经是编碼後的形式。如果服務器只處理其中一種,另一種就會返回 404;如果两種都能正常打開,就會形成两份内容相同的地址。
大小寫
域名不区分大小寫,但路径通常区分。/News/2024 和 /news/2024 在多數服務器上是两個不同地址。程序生成連結时随手寫了大寫,或者用戶手動輸入时首字母大寫,都會額外产生變体。
保留字符
& = ? # 這些符号在 URL 里有固定含义。如果标题里自带 & 或 #,没有正确编碼就拼進路径,參數會被截断,锚点會被当成頁面片段,請求到的内容和预期可能完全不同。
尾斜杠與預設文件名
目錄型 URL 加不加结尾斜杠,以及 /index.html 與根目錄,很多站点會同时返回 200。這些寫法會被当成多個地址,最终要靠規范化處理来收敛。
二、编碼不一致會带来什么
- 重复内容:同一篇文章出現编碼版和原文版两個地址,点击和權重被拆散。
- 抓取浪費:爬虫把時間花在跳轉和重复變体上,真正需要更新的頁面被推迟。
- 信号互相矛盾:内鏈指向一個地址,站点地图寫另一個,canonical 又指向第三個。
三、收敛顺序:先统一,再跳轉,最後看日誌
- 固定生成規則。让模板、CMS、接口輸出 URL 时统一大小寫、统一百分号编碼、统一是否带尾斜杠,尽量輸出绝對地址。
- 服務器兜底。對已经存在的變体做 301 跳轉到規范地址,不要長期用 302。
- 頁面級声明。在規范 URL 上寫 canonical 並指向自身,變体頁面不要自指。
- 對外渠道统一。内鏈、站点地图、RSS、分享按钮都使用同一形式,避免再次制造變体。
- 用日誌核對。篩選狀態碼為 301、404 的 URL,以及同一路径的不同寫法,確認數量在下降。
四、几個容易踩的邊界
- 中文路径本身不是错誤,但要確認服務器、日誌分析工具和站点地图都能正确處理编碼後的形式。
- 大小寫跳轉要避開静態资源。图片、CSS、JS 的路径在部分环境中区分大小寫,改错會直接導致頁面白屏。
- 带參數的篩選、排序連結,不要只靠 canonical 硬压,先判断這些地址是否真的需要被抓取。
- 不要為了“看起来干净”批量重寫歷史 URL,老地址没做跳轉就下线,已经收錄的頁面會直接丢掉。
URL 字符問题很少單獨造成明顯波動,但會持續制造重复地址和抓取浪費,属于典型的“小毛病、長期消耗”。
五、從哪一步開始
如果站点規模不大,可以先做三件事:導出服務器日誌里返回 301 和 404 的 URL,看哪些属于编碼變体;用索引报告核對同一篇文章是否存在多個地址;检查站点地图和主導航里的連結寫法是否完全一致。這三步做完,通常就能定位大部分字符层面的收錄問题,再按前面的顺序逐條收敛,並在一段時間後用日誌复查效果。