為什么先看握手,而不是先看狀態碼
很多人排查蜘蛛抓取問题时,第一反應是看狀態碼、看訪問日誌。但如果入口頁是 HTTPS,蜘蛛必须先完成 TLS 握手,才能發送 HTTP 請求。握手失敗时,服務器日誌里可能只有一條连接重置,甚至什么都没有,狀態碼自然也無從谈起。
對蜘蛛池入口頁来说,域名多、證书配置来源杂,HTTPS 問题比單站更容易出現。下面按常见顺序梳理。
證书鏈不完整:最容易漏掉的中間證书
服務器證书需要和中間證书一起下發,客戶端才能拼出完整信任鏈。如果只配置了域名證书,没有配中間證书,浏览器有时會缓存或自動补全,但蜘蛛和其他客戶端不一定有同样的容错能力。
检查方式:用 openssl s_client -connect 域名:443 -servername 域名 -showcerts 查看返回的證书數量。如果只返回一張,通常說明中間證书缺失。也可以使用在线 SSL 檢測工具,看信任鏈是否完整。
SNI 配置:多域名共用 IP 时的常见坑
同一台服務器上放多個 HTTPS 入口域名时,需要依赖 SNI 区分證书。如果服務器或 CDN 没有正确支持 SNI,蜘蛛請求某個域名时,可能拿到預設站点的證书,導致域名不匹配。
排查时,可以用不带 SNI 的請求測試,观察返回的證书是哪一個。如果預設證书和入口域名不一致,就要检查虚拟主机或 CDN 的 SNI 配置。
TLS 版本與加密套件
TLS 版本過舊,比如只開 TLS 1.0 或 1.1,現代蜘蛛可能直接拒绝连接。版本過新,比如只開 TLS 1.3,大多數蜘蛛已经支持,但极少數老舊爬虫可能握手失敗。稳妥的做法是同时支持 TLS 1.2 和 TLS 1.3,禁用已知不安全的加密套件。
不要為了兼容极少數舊客戶端,把 TLS 1.0 重新打開。舊协议带来的問题通常比它解决的更多。
證书有效期與域名匹配
證书過期、域名不匹配、通配符覆盖范围不足,都會让蜘蛛在握手阶段收到警告。有些蜘蛛會直接放弃,有些可能會繼續,但结果不稳定。
- 检查證书到期時間,設定提前續期提醒。
- 確認證书覆盖所有入口子域名,包括泛解析用到的域名。
- 如果使用多域名證书,核對 SAN 列表里是否包含實际入口。
混合内容與强制 HTTPS
入口頁本身是 HTTPS,但頁面内引用了 HTTP 资源,蜘蛛在渲染时可能遇到混合内容拦截。虽然這通常不影响 HTML 抓取,但會影响頁面完整性和後續連結發現。
另外,HSTS 头可以强制 HTTPS,但如果配置错誤,比如包含子域名但子域名没有證书,會把蜘蛛和自己都鎖在错誤配置上。啟用前先確認所有入口域名都能正常 HTTPS 訪問。
日常排查建议
- 固定用 curl -v 或 openssl 检查入口域名的握手過程。
- 從多個網絡节点測試,不同出口线路可能看到不同的證书或连接结果。
- 在服務器日誌中记錄 TLS 握手失敗,而不是只记錄 HTTP 狀態碼。
- 批量新增入口域名时,把 HTTPS 检查加入上线清單。
HTTPS 握手是入口頁可抓取性的第一道门槛。它不出問题时容易被忽略,一出問题又很难從狀態碼上直接看出来。把證书鏈、SNI、TLS 版本和域名匹配這几項做成例行检查,比事後猜测更有效。