入口頁里的連結寫法,比很多人想得更重要。搜尋蜘蛛不會“猜”你想要哪個地址,它拿到的是 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、内鏈里都是同一個字符串”。寫法统一了,抓取發現环节的噪音就少了一大半,剩下的問题也更容易定位到是内容质量、响應速度還是別的环节。