搜尋蜘蛛怎么判断“這是同一個站”
抓取队列是按 URL 组织的,而 URL 里最靠前的部分就是协议和主机名。http 與 https、带 www 與不带 www、example.com 與 example.com:8080,在抓取系統眼里是几個不同的入口。哪怕頁面内容完全一样,它們也會各自形成一條發現路径,各自记錄自己的抓取情况。
這類問题在改版、上 CDN、加證书之後特別容易出現:新入口出現了,舊入口没有關掉,两邊的内鏈還在互相指。
多入口會带来哪些具体麻烦
- URL 發現被摊薄:站内連結一半指向 A 主机、一半指向 B 主机,蜘蛛要跑两遍才能覆盖同一批頁面。
- Sitemap 声明冲突:文件里寫的是 https 版本,站内連結却大量使用 http 版本,声明和實际入口對不上。
- 日誌失真:按 URL 統計訪問时,同一頁面被拆成几份,很难判断哪些入口真的被走過。
- canonical 與重定向打架:頁面自己声明 A 為主,服務器又把 A 跳到 B,蜘蛛拿到的是矛盾信号。
- 測試域名被带進来:预發环境、CDN 預設域名如果缺少訪問限制,可能被外部連結拉進抓取队列。
先做一次入口盘点
不依赖工具也能查個大概:
- 用 curl -I 分別請求 http 與 https、带 www 與不带 www 的首頁,看返回的是 200 還是 301,跳轉终点是哪一個。
- 在服務器日誌里按 host 分组統計,看有几個主机名在持續被訪問,其中哪些是自己没打算公開的。
- 抽查首頁、栏目頁、詳情頁源碼,看内鏈寫死的主机名是否一致;導航、頁脚、面包屑经常是三套寫法。
- 打開 sitemap 索引和分片文件,確認里面所有 loc 都指向同一個主入口。
- 检查 CDN 與反向代理配置,有没有把某個域名的請求直接回源到同一份内容。
整理動作按這個顺序做
先選定一個主入口,再让其它入口全部 301 過去,顺序不要反過来。
- 服務器层面:把非主入口的协议與主机名统一 301 到主入口,保留原路径和參數,不要一律跳到首頁。
- 站内层面:模板里的内鏈、分頁、篩選、RSS 輸出,全部改用主入口。
- Sitemap 层面:文件内容與主入口一致,舊文件如果不再使用就替換掉,不要長期留两份。
- 声明层面:canonical、og:url 與主入口保持一致,避免和 301 给出相反信号。
不要用 robots.txt 屏蔽舊入口来代替跳轉。被屏蔽的 URL 仍然可能被外部連結發現,蜘蛛只是拿不到跳轉信号,入口問题會一直留着。
容易被忽略的小入口
- 端口号:不带端口與带 80/443 的寫法,在部分服務器配置下會被当成不同来源。
- 大小寫與结尾点:Example.com、example.com. 在部分解析环境下指向同一份内容。
- IP 直连和临时域名:調试时留下的連結、监控探针、第三方截图服務都可能留下记錄。
- m 站與多語言子域:如果内容與主站重复,需要明确各自的主入口關系,而不是让两邊互鏈。
- 混合内容:HTTPS 頁面里引用 HTTP 资源,會让蜘蛛在两種协议之間来回切換。
整理之後看什么
观察两周左右的日誌,重点看三件事:持續被訪問的主机名是否收敛到一個;同一頁面的抓取记錄是否合並;新頁面上线後第一次被發現的時間有没有變短。這些指标比“收錄了多少條”更能說明入口是否已经理顺。