入口页里的链接写法,比很多人想得更重要。搜索蜘蛛不会“猜”你想要哪个地址,它拿到的是 HTML 里那串字符串,然后按 URL 规范去解析、转义、归一化。中文、空格、&、#、% 这些符号只要有一个处理得不一致,蜘蛛跟到的可能就不是你心里的那个目标 URL。
能写全编码的绝对地址,就别省这一步
最稳妥的做法是:入口页输出前,把目标 URL 的路径和参数统一做一次 percent-encoding,编码用 UTF-8,然后以 https:// 开头的完整绝对地址写进 href。这样蜘蛛、浏览器、日志三方看到的字符串是一致的,后面排查问题会轻松很多。
几种最容易踩坑的写法
1. 中文和全角字符直接写进 href
浏览器通常会自动把中文转成 %E4%B8%AD 这类形式,但模板拼接、抓取工具、日志采集不一定做同样的转换。更麻烦的是编码不一致:入口页用 GBK 编出 %D6%D0,目标站按 UTF-8 解析,就会得到一个不存在的地址。建议统一在输出前用 UTF-8 编码,别指望下游帮你补。
2. 参数里的 & 没转义
在 HTML 里 & 要写成 &。如果直接写 ?a=1&b=2(未转义形式),部分解析器会把它当成 ?a=1 加一段无意义文本,蜘蛛请求到的地址就少了一个参数,轻则跳到别的页面,重则 404。
3. 空格、井号、加号
- 空格应写成 %20,不要用 +,加号在路径里是字面加号,不是空格。
- # 后面的内容不会发给服务器。如果目标 URL 靠片段传参(单页应用里很常见),蜘蛛实际请求的只是 # 前面那段,后面的路由参数它看不到。
- 中文括号、书名号、逗号这类全角符号,同样建议先编码再写。
4. 二次编码
已经编成 %E4%B8%AD 的路径,如果模板里又对整段 URL 做了一次 encodeURIComponent,就会变成 %25E4%25B8%25AD。这类地址在日志里很好认——出现 %25 基本就是重复编码,蜘蛛拿到的是一个打不开的页面。
相对路径还是绝对路径
相对路径蜘蛛能解析,但前提是入口页没有奇怪的 <base> 标签、页面自身 URL 稳定、模板没有多层拼接。入口页数量一多、站点结构一杂,相对路径很容易解析到意料之外的位置。省事的判断标准是:只要入口页不是和目标 URL 同目录同层级,就写绝对地址。
抓取环节真正麻烦的,往往不是“蜘蛛不聪明”,而是同一个目标对应了好几种写法,最后哪一版都没攒够信号。
大小写、斜杠、www 要统一
- 路径大小写:Windows 服务器常常不区分,Linux 服务器区分。/Page 和 /page 可能是两个地址,选一个固定写。
- 结尾斜杠:/abc 和 /abc/ 在不少站点是 301 关系,入口页里固定一种写法即可。
- 域名形式:带 www 和不带 www、http 和 https,尽量都归到一个最终形态,避免入口页同时输出两种。
- 和 sitemap、canonical、内链里的写法保持一致,不要入口页写一套、别处写另一套。
写完怎么验证
- 在浏览器里查看入口页源代码,复制 href 的内容粘到地址栏,看实际请求的路径。
- 用 curl -I 直接请求这个地址,确认返回状态码。
- 对比 sitemap 和页面 canonical 里的写法,看是不是同一个字符串。
- 看服务器日志里的请求路径:出现 %25、多出来的 &、或者中文被拆开,基本就是编码问题。
一个务实的判断标准
不必追求“最标准”的写法,而要追求“一条目标 URL 在入口页、sitemap、canonical、内链里都是同一个字符串”。写法统一了,抓取发现环节的噪音就少了一大半,剩下的问题也更容易定位到是内容质量、响应速度还是别的环节。