这个坑值得记一笔。全站已经 301 到 https,但没发 Strict-Transport-Security 头,外链和旧收藏每次都要先走一次 http 再跳,蜘蛛日志里一半请求是 301。

刚开始盯着「页面里的资源链接还有一部分写死 http」,折腾了半个多小时,排掉了。

把日志和配置对完,能解释这个现象的基本就这几处。缺 HSTS 头,浏览器和蜘蛛每次都要先试 http;301 响应没有缓存头,重复跳转每次都发生;CDN 与源站各返回一套跳转规则,链条变成两跳。

第一件事是确认响应头里有没有 HSTS

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

随后统计 301 请求占比

awk '{print $9}' access.log | sort | uniq -c | sort -rn | head

接着在 Nginx 里补上 HSTS 头

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

剩下的就是清理页面里写死的 http 资源

grep -rl 'http://www.example.com' wp-content/themes/ | head

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

改完先别撤,确认这几项。重复的 301 请求降到个位数,蜘蛛单次抓取只发一个请求,抓取量在同等预算下提升三成。

补一句。HSTS 只是让后续访问直接走 https,它不能替代 301,两者配合才能既快又稳。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189