同一頁面出現多個地址,通常不是一次事故
做站点运营时,经常會在日誌或抓取结果里看到同一篇内容被蜘蛛用不同 URL 反复訪問:/News/2024/summary 和 /news/2024/summary,或者 /about 與 /about/。它們指向同一份 HTML,但在服務器眼里是两條路径,在蜘蛛眼里也可能是两個候選頁面。這類問题往往不是某次改版造成的,而是模板、路由、内鏈、外鏈多年累积的结果。
它带来的直接後果是抓取請求被分摊、頁面之間的内鏈關系變得模糊。清理之後通常能减少一部分重复抓取,但別指望它單獨解决收錄問题,它属于打地基的工作。
大小寫:Linux 服務器上就是两條路径
Windows 的文件系統預設不区分大小寫,Linux 区分。站点從本地环境迁到线上後,如果模板里把目錄寫成 /Product/、内鏈寫成 /product/,在 Linux 上就是两條路径:可能一條正常返回、一條 404,也可能因為伪静態規則把两條都解析到同一個頁面,谁也不知道哪條會被蜘蛛记住。
- 目錄名和文件名尽量只用小寫字母、數字和连字符,新建内容时就把規則定死。
- 已经存在的混合大小寫路径,保留一個正式版本,其余统一 301 過去。
- 注意重定向目标本身也要是小寫版本,避免出現 A 到 B 再到 C 的跳轉鏈。
结尾斜杠:两種约定,只能選一種
结尾斜杠的處理有两種常见约定:目錄型地址(/news/)带斜杠,文件型地址(/news.html)不带。真正的麻烦是两者混用,同一個列表頁既能通過 /news 打開,也能通過 /news/ 打開,服務器還可能對其中一種做 301、對另一種直接返回 200。
约定本身没有绝對的對错,關键是全站一致:内鏈、sitemap、canonical、導航菜單、RSS、接口返回的連結,都用同一種寫法。只要有一處不一致,就相当于在站内给非正式版本留了一條入口。
其他容易漏掉的地址變体
- 預設文档:/index.html 與 / 同时可以訪問。
- 預設端口:带 :80 或 :443 的绝對地址被抓到並收錄。
- 协议與主机名:http 與 https、带 www 與不带 www 長期並存。
- URL 编碼:中文、空格被编碼成不同形式,同一個标簽頁出現多個版本。
- 參數顺序與大小寫:排序參數位置不同,生成的地址就不同。
怎么把問题找出来
- 翻服務器日誌,把返回 200 的 URL 去重後按路径归類,重点看尾部或主体高度相似的那些。
- 用站内抓取工具遍歷一遍,導出所有可以正常訪問的地址清單。
- 在搜尋控制台的頁面报告里,留意重复網頁、用戶未選定規范網頁一類的提示。
- 随机抽查栏目頁和詳情頁,手動敲入大小寫不同的地址,看服務器返回 200 還是 301。
统一處理的顺序
先在服務器或 CDN 层做归一化,把非正式版本 301 到正式版本,這一步覆盖面最广,也不用改业務代碼。然後回到内容层,统一模板、内鏈、sitemap 里的連結寫法,让新产生的頁面天然只有一種形態。canonical 可以留作兜底,但不该当成主要手段:如果服務器本身還在對两個地址返回 200,两邊信号容易打架。
判断标准很简單:不管從哪個入口点進来,用戶和蜘蛛最终都應该落在同一個地址上,而且這個地址只有一份内容。
改完之後不建议立刻批量提交,先观察几天的日誌,確認重定向生效、没有跳轉环、也没有把正常頁面誤伤成 404,再考虑推送新地址。這種清理不會带来立竿见影的效果,但它能让後面所有關于结构、内鏈和抓取的調整都站在一個干净的基础上。