常见问题

入口页用相对路径写链接,搜索蜘蛛拼出来的目标 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 标签,多数解析偏差都能在这里找到原因。改完之后优先用绝对路径固定下来,后续维护也省事。