在蜘蛛池入口页里,把目标链接写成相对路径是很常见的做法,省事、复制模板也方便。但对搜索蜘蛛来说,绝对地址和相对地址看到的不是同一件事:相对路径本身没问题,它只是把“最终指向哪个 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 发现只是第一步,蜘蛛拿到目标地址之后能不能正常响应、内容能不能稳定返回,是后面的事。别把相对路径当成技巧,它只是一个需要核对清楚的细节。