站点上线一段時間後,常會遇到一種情况:内容本身没什么明顯問题,但搜尋蜘蛛似乎在一些"長得几乎一样"的地址上反复出現。大小寫不同、末尾斜杠有無不同,往往就是這類重复的来源之一。這些地址在浏览器里打開可能顯示同样的頁面,在服務器日誌里却是几條獨立的记錄,對爬虫来说也属于不同 URL。
同一個頁面為什么會有多個入口
URL 的路径部分在大多數 Linux 服務器和主流 Web 框架中是区分大小寫的。這意味着 /News/2024/ 和 /news/2024/ 是两個不同的路径,如果服務器没有做统一處理,一個返回正常頁面,另一個可能返回 404,也可能因為框架的宽容匹配而返回同一份内容。
末尾斜杠同理。以目錄形式發布的栏目頁,习惯上寫成 /seo/;以文件形式發布的頁面,則常寫成 /seo.html 或 /seo。当站内連結、Sitemap、外部引用三處的寫法不一致时,同一個頁面就會以多種形態被记錄。
尾斜杠的两種處理思路
要不要保留尾斜杠,本身没有绝對的對错,關键是全站一致,並且让另一種寫法稳定地收敛到主版本。
- 统一保留:栏目、专题、标簽等聚合頁统一以斜杠结尾,具体頁面不加斜杠,規則简單,便于人工核對。
- 统一去掉:所有路径都不带尾斜杠,由服務器或框架把带斜杠的請求 301 到不带斜杠的版本。
- 避免混用:同一层級里既有 /a/ 又有 /b,後者訪問 /b/ 时返回 200 而不是跳轉,就會長期留下两個可訪問地址。
需要注意的是,用 301 收敛比用 302 或直接返回 200 更清晰。301 明确告诉爬虫哪個是主版本,連結權重也更容易集中到一個地址上。
大小寫問题的常见来源
大小寫混乱通常不是有意為之,而是几個环节叠加的结果:
- 編輯在正文里手寫内鏈,随手把栏目名首字母大寫。
- CMS 生成連結时按标题生成別名,某些版本會保留大寫字母。
- 舊站迁移时没有做路径统一,老地址被原样保留下来。
- 第三方統計、广告或合作方複製連結时改動了個別字母的大小寫。
其中最难處理的是"服務器能识別但寫法不同"的情况:訪問不存在的路径本该 404,却因為程序做了模糊匹配,把請求導向了猜测出的頁面。這種寫法會让爬虫認為多個地址都有效。
落地时的几條操作建议
- 先定規范:明确路径统一小寫、尾斜杠規則,寫進編輯和開發的手册,後續新頁面按規則生成。
- 再做收敛:對已有的错誤寫法配置 301,指向規范地址,避免出現多級跳轉鏈。
- 内鏈自查:用抓取工具或站内連結检查功能,掃一遍正文、導航、面包屑里的連結寫法是否统一。
- Sitemap 對齐:Sitemap 中只放規范地址,不要同时收錄带斜杠和不带斜杠的版本。
- Canonical 兜底:對于确實無法改動的歷史地址,用 rel=canonical 指明主版本,但不要把它当成長期方案。
怎么確認問题是否存在
比較直接的办法是翻服務器日誌,篩選狀態碼為 200 的請求,看看同一路径是否以多種大小寫或带斜杠、不带斜杠的形式反复出現。也可以手動在浏览器里分別訪問带斜杠和不带斜杠的地址,观察是否發生跳轉、跳到哪個地址。
這項工作的收益不在当天,而在于减少後續重复抓取,把有限的抓取机會留给真正需要更新的頁面。規范化做得越早,後面改的成本越低。
大小寫與尾斜杠看起来是细节,但它們决定了同一個頁面在爬虫眼里算一個還是几個。規則清晰、收敛稳定,URL 發現的過程才會更干净。