旧爬虫HTTPS连接失败主因是TLS版本、SNI或HSTS兼容问题;应保留HTTP 80端口并配置精准301跳转,禁用HSTS预加载,确保旧爬虫能连上、跳转并理解升级路径。

全站启用 HTTPS 后,旧版搜索引擎爬虫(如早期 Bingbot、Yahoo Slurp 或未更新 TLS 栈的定制爬虫)可能因不支持 TLS 1.2+、缺少 SNI 支持、或拒绝自签名/非预加载 HSTS 域名而失败连接。这不是用户侧问题,而是爬虫能力断层导致的抓取中断。优化核心不是“降级协议”,而是**在保持现代 HTTPS 安全前提下,让爬虫能连上、能跳转、能理解意图**。
保留 HTTPS 监听并启用智能 301 回退路径
即使已全站 HTTPS,仍需确保 HTTP 端口(80)持续监听,并配置精准的 301 跳转,而非直接关闭或返回 404/403:
- 对所有 HTTP 请求(包括爬虫发起的 http://domain.com/path),统一 return 301 到对应 HTTPS 地址:
return 301 https://$host$request_uri; - 避免使用 rewrite + permanent,因 return 性能更高、语义更明确,且不会触发 location 内部重匹配
- 特别注意:若存在历史 HTTP 入口(如外链、sitemap 中残留的 http 链接),此配置是爬虫发现新协议的第一跳,不可省略
禁用 HSTS 预加载与长周期缓存
HSTS(Strict-Transport-Security)虽提升安全,但对旧爬虫有兼容风险:
- 首次访问时若无 HSTS 预加载记录,部分老爬虫无法解析响应头,或忽略 HSTS 指令,导致后续请求仍走 HTTP 并失败
- 若已提交至 HSTS Preload List,浏览器和新版爬虫会强制 HTTPS,但旧爬虫可能直接放弃请求
-
建议操作:在 nginx.conf 的 HTTPS server 块中移除或注释掉
add_header Strict-Transport-Security ...;若必须启用,设为max-age=0(即禁用缓存),避免固化策略
HTTPS server 块内不拦截低 TLS 版本请求,改用重定向引导
某些旧爬虫仅支持 TLS 1.0/1.1,而现代 Nginx 默认禁用这些协议。强行开启存在安全风险,更优解是让其“连得上、看得懂、跳得走”:
- 不开放 TLSv1.0/TLSv1.1,但确保
ssl_protocols TLSv1.2 TLSv1.3;下,服务器仍能接受握手并返回标准 301 响应(Nginx 默认支持) - 关键点:只要爬虫能完成 TCP 握手并发送 HTTP 请求(哪怕 TLS 版本不匹配),Nginx 就可返回 301 Location 头——这是比“连接拒绝”更友好的信号
- 验证方式:
curl -I --tlsv1.1 https://domain.com应返回 301(而非 SSL handshake failed);若失败,说明底层 TLS 层已阻断,需检查 openssl 版本与编译选项
主动适配爬虫 User-Agent 的轻量 fallback 页面(可选)
对极少数仍发 HTTP 请求且不遵循 301 的爬虫(如某些遗留监控 bot),可加一层防御性配置:
- 在 HTTP server 块中,用 if 判断常见旧爬虫 UA(如
"Slurp","msnbot","ia_archiver"),返回一个极简 HTML 页面,内含 meta refresh 和显式链接:<meta http-equiv="refresh" content="0;url=https://..."> - 该页面不参与 SEO,仅作兜底;同时记录 UA 日志,用于识别真实影响范围
- 注意:避免滥用 if,仅限 UA 字符串精确匹配,不推荐正则模糊判断
不复杂但容易忽略:旧爬虫不是要你“倒退”,而是需要一条清晰、稳定、符合 HTTP 规范的升级路径。HTTPS 是底线,重定向是桥梁,HSTS 是护栏——护栏不该挡住想进门的人。


















