常见问题

入口页目标链接带 # 锚点:搜索蜘蛛请求的到底是哪个地址

入口页里的目标链接常被加上 # 开头的一段内容用来区分来源,但服务端和搜索蜘蛛收到的请求都只到 # 之前。本文说明锚点为什么进不了抓取请求、由此产生的三类常见误用,以及用路径、查询参数、Referer、跳转区分来源时各自要注意的问题。

常见问题

入口页目标链接带 # 锚点:搜索蜘蛛请求的到底是哪个地址

做入口页的时候,很多人会在目标链接后面加一段以 # 开头的内容,比如 https://example.com/post#source=pool1,用来区分不同入口带来的访问。问题是:搜索蜘蛛抓到这条链接时,请求的到底是带 # 的完整地址,还是只有 # 前面那一截?答案是明确的——# 后面的内容不会进入 HTTP 请求。

锚点为什么发不到服务器

URL 标准里,# 及其后面的部分叫 fragment(片段标识符)。它的设计目的是让浏览器在已经拿到的文档内部做定位,比如跳到某个小标题。这个动作完全在客户端完成,服务器从头到尾看不到它。

搜索蜘蛛遵循同一套规则:解析链接、去掉 fragment、用剩下的部分发请求。所以无论入口页怎么写锚点,蜘蛛对服务器的请求都只有路径加查询参数。

蜘蛛实际请求的地址长什么样

  • 入口页写 https://example.com/a#part1 → 蜘蛛请求 https://example.com/a
  • 同一页再写 https://example.com/a#part2 → 仍然只请求 https://example.com/a
  • 写 https://example.com/a?#part3(问号后直接跟 #)→ 同样只请求 /a
  • 只写 href="#top" 这类纯锚点 → 指向当前页面自身,不是一个新 URL

也就是说,锚点既不改变服务器收到的路径,也不改变蜘蛛的抓取次数。它只影响浏览器渲染时的定位行为。

三个常见的误用

用 # 传来源参数

#source=pool1 只有页面里的脚本能读到,服务端访问日志里看不到。如果来源统计依赖日志,这类参数等于没写,白忙一场。

指望同一 URL 配不同锚点被当成多个页面

有人给同一个目标 URL 挂上 #a、#b、#c,想让蜘蛛“多发现几个地址”。实际它看到的始终是同一个 URL,不会产生额外的发现或抓取。

用 # 掩盖真实参数再靠脚本跳转

前端读取 # 后再用脚本跳到真实地址,这属于动态注入链接。能否被发现,取决于抓取端是否执行脚本、渲染是否完成,和直接给静态链接完全不是一回事。

想区分来源,可以怎么做

  1. 用不同路径:入口页指向 /lp/pool1/ 这类独立路径,服务端可统计。但要注意别批量生成内容雷同的页面,否则统计清楚了、页面质量却下去了。
  2. 用查询参数:?from=pool1 服务端可见。风险是同一目标 URL 挂太多不同参数,可能被当成多个地址反复抓取,最好配合 canonical 收敛,或让 robots.txt 挡掉无意义的参数组合。
  3. 看日志里的来源信息:蜘蛛抓取目标 URL 时通常带着来源页字段,入口页本身也可以靠这个反推,不必把参数塞进链接。
  4. 用中间跳转:入口页放一个带参数的中间地址,由它跳转到最终目标,参数留在跳转前的日志里,最终页保持干净。

几个容易忽略的边界

href="#" 和 href="javascript:;"

这类写法没有指向任何真实地址,蜘蛛不会把它当成可抓链接,也不会因此发现别的内容。放在入口页里只会让页面看着链接很多,实际是空的。

前端路由里的 #

#/list 这种路由形式,蜘蛛请求的仍然是 # 之前的部分,路由内容要靠脚本渲染。能不能被发现取决于抓取端是否渲染 JS,不取决于锚点本身。

跳转响应里带 #

如果服务器返回的跳转地址里带了 fragment,浏览器会把它保留下来,但服务器端日志依然只有路径部分。别指望用这种方式在日志里留下来源标记。

上线前的自检清单

  • 目标页是否只有读 # 后面的内容才能正常展示?如果是,蜘蛛看到的很可能是空页或残缺页。
  • 来源统计是不是写在了 # 里?若是,服务端数据会缺失。
  • 同一目标 URL 是否因为参数被拆成很多个地址?需要收敛或加 canonical。
  • 入口页里的 href="#" 是否被误当成有效链接?建议清理掉。
锚点解决的是文档内定位问题,不是链接唯一性或来源追踪问题。把它当成地址的一部分来用,得到的往往是和预期相反的统计结果。