做蜘蛛池或站内互鏈时,很多人把精力放在“連結放没放”上,却忽略了一個更基础的問题:這個連結的地址,搜尋蜘蛛讀出来的和你以為的是不是同一個。相對路径少寫一個斜杠、多一层目錄,蜘蛛請求的可能就是一個 404 地址,入口頁等于白做。
搜尋蜘蛛怎么解析相對路径
HTML 里的 href 如果是相對路径,浏览器和搜尋蜘蛛都要先把它和“目前頁面的 URL”做一次拼接,才能得到完整地址。這個拼接規則由 RFC 3986 定义,核心是:以目前文档 URL 為基准,替換掉最後一段路径。
举例,入口頁地址是 https://a.com/dir/page.html:
- href="target.html" → https://a.com/dir/target.html
- href="/target.html" → https://a.com/target.html
- href="../target.html" → https://a.com/target.html
- href="./target.html" → https://a.com/dir/target.html
規則看着简單,但真正的坑在于“目前頁面 URL”到底是什么。它不一定是你在浏览器地址栏里看到的那個。
几個容易跑偏的场景
1. 頁面是通過跳轉或重寫到達的
如果入口頁是经過 301、302,或者服務器内部重寫後才返回内容,蜘蛛解析相對路径时用的基准,通常是最终返回内容的那條 URL,而不是你最初請求的那條。比如 /go/123 跳轉到 /article/456,頁面里寫 href="a.html",蜘蛛會去請求 /article/a.html,而不是 /go/a.html。這類誤差在日誌里會表現為“我明明没放這個地址,却被請求了”。
2. base 标簽
頁面里如果存在 <base href="...">,所有相對路径都會以它為准,目前頁地址反而不參與解析。批量生成的模板里如果残留了一個 base 标簽,整站相對連結可能全部指向另一個域名。检查入口頁时,顺手搜一下源碼里有没有這個标簽。
3. 协议相對和上級路径
href="//b.com/x" 這種寫法會沿用目前頁面的协议:http 頁面里就是 http,https 頁面里就是 https。如果你的站点正在做 http 到 https 的迁移,這類連結可能出現协议混乱,蜘蛛跟過去先吃一次 301。而 ../ 用得過多,容易跳出预期目錄,把蜘蛛带到你並不希望它抓的路径上。
4. URL 里的中文、空格和特殊字符
相對路径里带中文、空格、&、# 时,解析结果依赖编碼。空格在有些解析器里被当成路径分隔,& 會被誤認為參數分隔。稳妥做法是對這些字符做百分号编碼,或者干脆不用。
怎么確認蜘蛛讀到的到底是哪個地址
- 用抓取工具(curl、無痕浏览器或本地小爬虫)按蜘蛛的 UA 抓一次入口頁,重点看返回的 HTML 原文,而不是渲染後的 DOM。
- 把 HTML 里所有 href 抽出来,用目前頁 URL 逐個做一次解析,再和你的目标地址清單對照。
- 看完工日誌里蜘蛛實际請求的路径。如果出現大量 404,而且路径和入口頁所在目錄拼得上,基本就是相對路径解析問题。
一個经驗:入口頁面向蜘蛛时,連結尽量寫完整的绝對地址,把解析环节的變量降到零。相對路径省的是編輯成本,付出的可能是排查成本。
修正建议
- 入口頁里的目标連結统一用绝對 URL,包含协议和域名。
- 確認頁面源碼里没有多余的 base 标簽。
- 入口頁不要先做多級跳轉再輸出連結。
- 模板批量生成後,抽样检查 HTML 源碼里的 href 原值。
- 日誌里出現非预期路径时,先回头核對入口頁 HTML,再怀疑其他环节。
相對路径本身没有問题,绝對路径也一样。真正要紧的是:搜尋蜘蛛解析出的地址,和你希望它抓的地址,是不是同一個。入口頁上多花几分钟做這個核對,比事後在日誌里猜要省事得多。