做入口頁时,很多人關心連結放几條、放在什么位置,却很少在意連結寫成相對路径還是绝對路径。這两種寫法對浏览器来说差別不大,但對搜尋蜘蛛解析目标 URL 會有實际影响。
相對路径是怎么被拼成完整 URL 的
搜尋蜘蛛遇到 href="/a/b.html" 或 href="b.html" 這類相對路径,會拿目前頁面的 URL 作為基准去拼接。拼接規則跟浏览器一致:以斜杠開头的從域名根開始,不以斜杠開头的從目前目錄開始。
所以同一段連結代碼,放在 https://www.example.com/list/index.html 和 https://www.example.com/list/sub/ 下,拼出来的结果可能完全不同。入口頁如果存在多個路径层級,寫成绝對路径能避免這類偏差。
几種容易拼错的情况
頁面里有 base 标簽
如果入口頁头部寫了 base 标簽,那么所有相對連結都會以 base 里的地址為基准,而不是目前頁面地址。蜘蛛和浏览器都會遵守這個規則。一旦 base 寫错,或者複製模板时忘了改,整頁連結可能全部指向错誤的域名或目錄。
结尾斜杠带来的目錄判断
https://www.example.com/list 和 https://www.example.com/list/ 在解析相對連結时被当作不同层級。前者把 list 当成文件,相對連結從上一級目錄開始拼;後者把 list 当成目錄,相對連結從 list/ 下開始拼。入口頁如果依赖相對路径,最好確認自己用的是哪一種形式。
协议相對 URL
href="//www.example.com/a.html" 這種省略协议的寫法,會繼承目前頁面的协议。HTTP 和 HTTPS 混用或迁移期間,可能導致蜘蛛抓到的是另一個协议版本的 URL,最终被当成不同地址處理。
href 里的多余空格與換行
属性值中間混入空格、制表符或換行时,不同解析器處理方式不完全一致,轻則 URL 被截断,重則拼出一個不存在的路径。入口頁如果由程序批量生成,建议在輸出环节做一次去空格和轉义检查。
绝對路径是不是一定更好
對于蜘蛛池入口頁這類需要精确控制目标 URL 的场景,直接用完整绝對路径通常更稳妥。它不受 base、目錄层級、结尾斜杠影响,連結指向哪里一目了然,排查日誌时也更省事。
相對路径並非不能用。站内導航、同目錄资源用相對路径反而方便维護,換域名时也不用逐條修改。關键在于入口頁輸出的連結是否可预期、是否和實际目标一致。
相對路径的問题往往不是抓不到,而是抓到了你没想到的那個 URL。
實操检查清單
- 入口頁模板里是否残留了不该出現的 base 标簽
- 目标連結是否混用了相對路径和绝對路径,導致解析基准不一致
- 頁面 URL 结尾有没有斜杠,是否和相對連結的寫法匹配
- 是否出現 // 開头的协议相對連結,协议版本是否统一
- 連結中的大小寫、多余參數是否和實际目标一致
- 程序生成的 href 是否包含空格、換行等異常字符
怎么快速驗證
可以先在浏览器里查看頁面源碼,把相對連結按規則手動拼一遍,再和服務器日誌里蜘蛛實际請求的 URL 對照。两邊一致說明寫法没問题;出現偏差时,優先把入口頁的目标連結改成绝對路径,問题通常會明顯收敛。
如果入口頁數量較多,不建议一次全改。先挑几個路径层級不同的頁面做样本,確認解析结果稳定後,再按模板统一調整,這样也方便對比改動前後的抓取记錄。