做蜘蛛池入口页的人,注意力大多放在 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 形态、内链和内容才有意义。