现场是这样的。主域返回 Strict-Transport-Security: max-age=31536000; includeSubDomains,图片子域 img.example.com 没有证书,全站图片在两小时内变成裂图。

中间走过弯路,把「策略一旦下发会被浏览器缓存,撤掉响应头也不能立刻恢复」当成主因,改完现象没变。

真正麻烦的地方在于,几个原因的现象几乎一样。includeSubDomains 对主域下所有子域生效且无法单独排除;图片子域挂在对象存储上,只支持 http 访问;蜘蛛侧同样遵守缓存策略,抓取图片连续失败。

先确认 HSTS 响应头的完整取值

curl -sI https://www.example.com/ | grep -i strict-transport

去掉 includeSubDomains 只保留主域

add_header Strict-Transport-Security 'max-age=31536000' always;

剩下的就是检查各子域是否都有可用证书

for h in img static cdn; do echo $h; curl -sI https://$h.example.com/ | head -1; done

白天有业务在跑,能验证的部分都压到了晚上做。

别只看报错消失,验证要多做一步。去掉 includeSubDomains 并给图片子域补上证书后,图片在缓存过期前逐步恢复,抓取失败率降到零。

补一句。下发这条指令前先把所有子域的证书过一遍,撤回头部并不能清掉已经在客户端落地的策略。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189