做蜘蛛池入口頁的人,注意力大多放在 URL 形態、内鏈结构和内容上,很少把 HTTPS 当成一件需要單獨對待的事。但實际排查日誌时,经常能看到一類問题:蜘蛛根本没有請求到頁面,日誌里只有失敗记錄。這類情况里,TLS 握手失敗占的比例並不低。
為什么問题會先卡在握手阶段
HTTP 請求的鏈路是「DNS 解析 → TCP 连接 → TLS 握手 → 發送請求 → 返回响應」。蜘蛛只有在握手成功之後,才會真正發出 GET 請求。一旦握手阶段就断開,無论是内容、结构還是内鏈,都谈不上被看到。而握手失敗在普通浏览器里往往被自動兜底或缓存掩盖,人工訪問时不容易發現。
證书鏈不完整:最常见的隐形故障
證书鏈不完整指的是服務器只返回了站点證书,没有把中間證书一並下發。浏览器通常带着缓存或者會自行补全,所以看起来一切正常;但一些爬虫客戶端、命令行工具不會做這種补全,握手就會直接失敗。批量部署入口頁时,證书文件複製粘贴出错、只上传了 .crt 没带 ca-bundle,都是常见原因。
- 用 openssl s_client -connect 域名:443 -servername 域名 检查返回的證书鏈层數,正常應能看到中間證书。
- 用 curl -vI 观察是否有證书校驗相關的报错,不要只看到 200 就認為没問题。
- 換了服務器或 CDN 之後重新驗證一次,證书鏈問题经常是在迁移时引入的。
域名覆盖:泛域名、多域名與 SNI
入口頁常用泛解析,如果證书只是一張單域名證书,那些随机子域就會握手失敗。這種情况下要么換成泛域名證书,要么用多域名證书覆盖實际會啟用的入口域名。另外,SNI 是現代 TLS 的常規机制,但仍有少數舊客戶端不支持,如果服務器上挂着多個站点,未配置預設站点證书时,不带 SNI 的請求可能落到错誤的證书上。
跳轉鏈:從 http 到 https 最好只跳一次
入口頁的跳轉鏈過長,會让蜘蛛在多次跳轉中消耗時間,也容易出現某一跳指向的地址本身就不通。
- 確認 http 到 https 是一跳 301,而不是先跳 https 再跳不带 www 或反過来。
- 统一结尾斜杠規則,避免 /a 與 /a/ 之間来回跳。
- 跳轉目标要與證书覆盖的域名完全一致,不要在跳轉里換域名。
- 跳轉鏈检查建议直接抓取一次,看完整鏈路,而不是凭配置推测。
混合内容:頁面能打開不等于没隐患
頁面主体走 HTTPS,但引用的图片、JS、CSS 還是 http 地址,這就是混合内容。浏览器會拦截或降級處理,部分爬虫可能直接忽略這些资源。虽然蜘蛛一般不执行完整渲染,但如果頁面依赖 JS 做内容填充或跳轉,混合内容被拦截後就可能什么都拿不到。批量替換入口頁模板里的资源地址,是比較稳妥的做法。
HSTS:方便,但別随手加 includeSubDomains
HSTS 能让後續訪問强制走 HTTPS,看起来省事,但一旦下發 includeSubDomains,所有子域都會被约束。如果入口頁用的泛解析域名里有一部分暂时没有證书,或者你需要临时回退到 HTTP 做排查,就會非常被動。建议只在確認證书覆盖完整之後再考虑啟用,且注意 max-age 的設定。
握手阶段失敗是「静默失敗」,既不會留下正常的訪問日誌,也不會有错誤提示。定期主動驗證,比等日誌里出現異常要可靠。
和 CDN 配合时容易踩的坑
使用 CDN 时,邊缘节点到源站的回源鏈路同样需要握手。邊缘證书正常、回源證书過期或不匹配,用戶侧看到的可能是 502 或 5xx,而源站日誌里什么都没有。另外,源站的防火墙如果只放行 CDN 回源 IP,而 CDN 回源地址發生變化,也會表現為間歇性失敗。
日常维護清單
- 记錄每張證书的到期時間,提前至少两周續期,不要等到当天。
- 入口頁批次上线前,對每個域名做一次握手與跳轉鏈路检查。
- 證书變更、服務器迁移、CDN 調整後,重新跑一遍检查。
- 把證书校驗失敗計入监控,而不是只监控 HTTP 狀態碼。
HTTPS 配置本身不产生排名,也不保證被抓取,但它决定蜘蛛能不能走到你的入口頁面前。把這一层做干净,後面讨论 URL 形態、内鏈和内容才有意义。