现场是这样的。测试站点加了严格传输头,后来要临时走 http 做兼容,结果浏览器直接拒绝访问,清缓存也不起作用,换一个浏览器才正常。
原因不止一个,得分开看。浏览器缓存了强制跳转策略且不清除;策略里带了子域,所有子站被一起强制;回退时没有先把最大生存时间降到零。
动手时先确认当前返回的策略头
curl -sI https://域名 | grep -i strict-transport
接着把最大生存时间改为零
add_header Strict-Transport-Security 'max-age=0' always;
然后重载并让客户端访问一次
systemctl reload nginx && curl -I https://域名
末了确认子域不再被强制
curl -sI https://子域名 | grep -i strict
中途换过一次思路,把范围缩到最小的那一层,反而快了。
别只看报错消失,验证要多做一步。访问一次后浏览器不再强制跳转,http 可以正常打开,子域也不再被牵连。
提醒一点。缓存存在浏览器里,服务端删掉头部并不会生效;必须先下发零时长让客户端自己清除,之后才能移除。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。