在蜘蛛池入口頁里,把目标連結寫成相對路径是很常见的做法,省事、複製模板也方便。但對搜尋蜘蛛来说,绝對地址和相對地址看到的不是同一件事:相對路径本身没問题,它只是把“最终指向哪個 URL”這個决定權,交给了入口頁自己所在的地址。
相對路径的解析基准是什么
搜尋蜘蛛抓到一個頁面後,會以這個頁面的最终 URL 作為基准,去解析頁面里的每一個相對連結。這里的關鍵詞是“最终 URL”:如果蜘蛛請求的地址發生過跳轉,基准是跳轉後的地址,而不是跳轉前的。
- 入口頁最终地址是 https://a.com/list/index.html,連結寫成 ../target/1.html,解析结果是 https://a.com/target/1.html。
- 同一段連結放在 https://a.com/list/2025/ 下,解析结果就變成 https://a.com/list/2025/target/1.html。
換句话说,同一份 HTML 被放到不同目錄下,蜘蛛看到的目标 URL 完全不同。入口頁模板被複製到多個路径下时,這一点尤其容易出错,而且出错时頁面看不出来任何異常。
几種容易踩的坑
入口頁自身發生過 301
如果蜘蛛請求的地址 301 跳到了另一個目錄,相對連結就會按新目錄解析。例如 http://a.com/x/ 跳到了 https://a.com/y/z/,頁面里寫的 1.html 會被解析成 https://a.com/y/z/1.html,而不是很多人以為的 /x/1.html。
頁面里残留 base 标簽
如果入口頁 HTML 里存在 base href,蜘蛛會以它為准,而不是以目前頁面地址為准。這個标簽常出現在模板系統生成的頁面里,域名或目錄改了却没同步,结果蜘蛛拿到的目标 URL 全部指向舊地址。
目錄地址的尾斜杠
入口頁地址是 /list 還是 /list/,在某些服務器上會返回不同结果。如果訪問 /list 时被跳到 /list/,基准就是带斜杠的那個;如果没跳轉,基准按 /list 處理,相對連結的解析层級會差一級,目标 URL 就整体偏了一层目錄。
协议相對寫法 // 的繼承
寫成 //a.com/target 這種协议相對形式时,蜘蛛會繼承入口頁目前使用的协议。入口頁被 http 和 https 两種方式都能訪問时,同一份頁面可能解析出两個不同协议的目标地址,日誌里看到的就是两套請求。
想稳一点可以怎么做
- 入口頁里的目标連結優先寫完整绝對 URL,尤其是跨目錄、跨域名、走 CDN 的目标。
- 如果必须用相對路径,先確認入口頁的最终地址,再手工推導一遍解析结果。
- 检查模板里有没有残留的 base 标簽,以及有没有 http 與 https 混用的入口。
- 上线後用服務器日誌驗證蜘蛛實际請求的地址,而不是只翻頁面源碼。
相對路径不是問题,問题是它依赖的基准经常在你看不见的地方改變——跳轉、CDN、模板、尾斜杠,任何一處變動都會让目标 URL 換一個。
最後提醒一句:URL 發現只是第一步,蜘蛛拿到目标地址之後能不能正常响應、内容能不能稳定返回,是後面的事。別把相對路径当成技巧,它只是一個需要核對清楚的细节。