入口頁里寫連結时,很多人图省事用相對路径,比如 href="/go/123"。這里有個前提問题:搜尋蜘蛛拿到的只是一串相對字符串,它必须先知道"相對于谁",才能拼出完整 URL。如果這個基准和你想的不一样,蜘蛛解析出来的地址就不是你希望它發現的那個目标 URL。
搜尋蜘蛛解析相對連結的三個依據
- 入口頁自身的 URL:蜘蛛從抓取队列里拿到入口頁地址,通常以它作為解析基准。
- HTML 里的 base 标簽:如果頁面寫了 <base href="...">,基准會被替換成 base 指定的地址。
- 标准路径拼接規則:以 / 開头從域名根拼,不以 / 開头從目前目錄拼,./ 和 ../ 按 URL 規范處理。
几種常见寫法的實际解析结果
假设入口頁地址是 https://pool.example.com/list/a.html,頁面上不同寫法會得到不同结果:
- href="/target/1" → https://pool.example.com/target/1
- href="target/1" → https://pool.example.com/list/target/1
- href="../target/1" → https://pool.example.com/target/1
- href="//other.example.com/x" → https://other.example.com/x,协议沿用目前頁面
- href="?id=1" → https://pool.example.com/list/a.html?id=1,這種等于連結回自己,並不是一個新目标 URL
可以看到,少寫一個斜杠,目錄层級就變了,最终地址可能指向一個並不存在的路径,蜘蛛抓過去只會拿到 404。
base 标簽為什么容易把連結带偏
有些入口頁模板為了统一资源路径,會在头部寫 <base href="https://cdn.example.com/">。這行一旦存在,頁面里所有相對連結都會以 CDN 域名為基准,蜘蛛拼出来的目标 URL 就變成了 cdn.example.com 上的地址。除非你的目标本来就在這個域名下,否則這就是典型的解析偏差,而且從頁面代碼表面看不太出来,排查时容易被忽略。
容易出错的几個细节
- 入口頁 URL 自己带不带尾斜杠,會影响相對路径按目錄還是按文件来解析。
- 使用了 URL 重寫或反向代理时,服務器内部看到的路径和外部訪問地址可能不一致,頁面里的相對連結基准會跟着错。
- 入口頁存在多個域名變体,比如 www 與非 www、http 與 https,不同變体下拼出的目标 URL 可能不同,等于把發現行為分散了。
- 相對連結里如果含未编碼的空格或中文,拼接可能直接失敗,這属于编碼問题,需要單獨處理。
可操作的排查步骤
- 用抓取工具或命令行請求入口頁,確認真實返回的 HTML 和浏览器里看到的一致。
- 拿入口頁的最终 URL,手動把相對連結拼一次,看结果是否等于你期望的目标 URL。
- 检查頁面上有没有 base 标簽,有的话確認它是不是你想要的基准。
- 目标是跨域名地址时,直接寫绝對地址,减少歧义。
- 在服務器日誌里對比搜尋蜘蛛實际請求的路径,與入口頁里寫的路径是否吻合。
相對路径本身不是問题,問题在于基准是否可控。只要入口頁 URL 稳定、没有意外的 base 标簽,相對連結一样能被正常發現。
如果日誌里發現搜尋蜘蛛請求的地址和你预期的目标 URL 對不上,先別急着怀疑蜘蛛池本身,回到入口頁的 HTML,按上面的顺序核對相對連結和 base 标簽,多數解析偏差都能在這里找到原因。改完之後優先用绝對路径固定下来,後續维護也省事。