常见问题

入口页的相对链接和 base 标签:搜索蜘蛛解析出的目标地址为什么和你以为的不一样

入口页链接写成相对路径,或页面里用了 base 标签,都会改变搜索蜘蛛解析出的目标地址。本文说明解析基准怎么确定、哪些写法最容易把链接指到别的目录,以及如何用开发者工具和日志核对蜘蛛实际请求的 URL。

常见问题

入口页的相对链接和 base 标签:搜索蜘蛛解析出的目标地址为什么和你以为的不一样

做蜘蛛池或站内入口页时,很多人只关心链接放没放上去,却忽略了链接地址最终被解析成什么。相对路径和 base 标签都会改变这一点:源码里写的是 a/b,蜘蛛请求的可能是另一个地址。

相对路径以当前页面地址为基准解析

搜索蜘蛛拿到 HTML 后,会按 URL 标准把相对路径拼成绝对地址,基准是入口页自身的最终 URL,也就是经过跳转之后真正返回内容的那一个。举例:入口页地址是 https://example.com/list/index.html,页面里写 href="detail/1.html",解析结果是 https://example.com/list/detail/1.html;如果写成 /detail/1.html,则解析为 https://example.com/detail/1.html。

容易出错的是目录和文件的混淆。入口页地址是 https://example.com/list 而没有末尾斜杠,相对路径 detail/1.html 会被解析成 https://example.com/detail/1.html,不是 /list/detail/1.html。这个差异会直接让蜘蛛请求到 404,或者抓到另一个不相关的页面。

base 标签会整体改写解析基准

如果入口页 head 里写了 base href,指向例如 https://example.com/other/,那么页面上所有相对链接都会以这个地址为基准,而不是当前页面地址,蜘蛛一般会遵守这个规则。这时页面里写 href="1.html",蜘蛛请求的就是 https://example.com/other/1.html。

几个细节值得注意:

  • 规范只认第一个 base href,后面出现的通常会被忽略;
  • base 写在 head 之外、或写在链接之后,不同解析器的处理可能不一致,最好统一放在 head 靠前位置;
  • base 只影响相对 URL,绝对 URL 和以井号开头的锚点链接不受影响;
  • 协议相对写法如 //cdn.example.com/x 会继承当前页面的协议,http 页面里就是 http。

哪些写法最容易出问题

  • 相对路径省掉前导斜杠,靠目录层级猜位置,解析结果和预期不同;
  • 入口页存在跳转,基准变成跳转后的地址,相对路径随之改变;
  • 同一批入口页放在不同目录,模板里写的是相对路径,结果指向了不同页面;
  • 链接里带空格、中文、特殊符号没有做 URL 编码,蜘蛛请求的是编码后的形式;
  • 把 base 当成统一前缀批量复用,忘了它对页面上所有相对链接都生效。

怎么核对蜘蛛实际请求的地址

  1. 浏览器打开入口页,用开发者工具选中链接,看 DOM 里 a 元素 href 属性的解析结果,而不是源码里写的值;
  2. 查看服务器日志中蜘蛛对入口页的请求,以及随后对哪些路径发起了请求,对比是否与预期一致;
  3. 用抓取工具或本地脚本解析 HTML,输出每个链接解析后的绝对 URL,批量检查;
  4. 把入口页和模板里的相对路径尽量改成绝对路径,尤其是跨目录、多子域的场景。
相对路径和 base 标签属于解析层的问题,链接本身有效,只是解析结果和预期不同。先把这一步核对清楚,再去讨论抓取和收录。

一点实践建议

入口页数量多、模板复用时,最省心的做法是链接统一写绝对地址,或者至少统一加前导斜杠。如果必须用 base,就把它固定写在 head 最前面,并在测试环境确认解析结果。

蜘蛛发现 URL 只是第一步,能否被抓取、会不会被索引,还取决于页面返回状态、内容质量和站点整体情况。遇到路径对不上时,先看日志里蜘蛛请求了什么,比反复调整入口页更有效率。