常见問题

入口頁用相對路径寫連結,搜尋蜘蛛拼出来的目标 URL 到底對不對

入口頁里用相對路径寫連結很常见,但搜尋蜘蛛必须先确定解析基准才能拼出完整地址。本文說明蜘蛛解析相對連結的依據、几種常见寫法的實际结果,以及 base 标簽、多域名變体等容易造成解析偏差的细节,並给出可操作的排查步骤。

常见問题

入口頁用相對路径寫連結,搜尋蜘蛛拼出来的目标 URL 到底對不對

入口頁里寫連結时,很多人图省事用相對路径,比如 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 可能不同,等于把發現行為分散了。
  • 相對連結里如果含未编碼的空格或中文,拼接可能直接失敗,這属于编碼問题,需要單獨處理。

可操作的排查步骤

  1. 用抓取工具或命令行請求入口頁,確認真實返回的 HTML 和浏览器里看到的一致。
  2. 拿入口頁的最终 URL,手動把相對連結拼一次,看结果是否等于你期望的目标 URL。
  3. 检查頁面上有没有 base 标簽,有的话確認它是不是你想要的基准。
  4. 目标是跨域名地址时,直接寫绝對地址,减少歧义。
  5. 在服務器日誌里對比搜尋蜘蛛實际請求的路径,與入口頁里寫的路径是否吻合。
相對路径本身不是問题,問题在于基准是否可控。只要入口頁 URL 稳定、没有意外的 base 标簽,相對連結一样能被正常發現。

如果日誌里發現搜尋蜘蛛請求的地址和你预期的目标 URL 對不上,先別急着怀疑蜘蛛池本身,回到入口頁的 HTML,按上面的顺序核對相對連結和 base 标簽,多數解析偏差都能在這里找到原因。改完之後優先用绝對路径固定下来,後續维護也省事。