很多人觉得HTTPS只是给网站加了个小绿锁,看起来安全就行,其实它对缓存的影响比想象中大得多。尤其是在做网页优化或排查加载慢的问题时,HTTPS的缓存机制如果不搞清楚,很容易踩坑。
默认不缓存敏感内容
浏览器对HTTPS资源更“谨慎”。比如用户登录后的页面、包含个人信息的接口数据,即使你设置了缓存头,浏览器也可能直接不缓存。这是为了防止敏感信息被第三方读取。举个例子,你在银行网站查余额的页面,就算服务器说“可以缓存5分钟”,浏览器大概率还是每次重新请求。
Cache-Control 要写清楚
在HTTPS环境下,光靠Expires或者Last-Modified已经不够用了。必须明确使用Cache-Control来控制行为。比如你想让静态资源缓存一小时,应该这样设置:
Cache-Control: public, max-age=3600
如果是API返回的私有数据,就得改成:
Cache-Control: private, max-age=600
别忘了,private表示只能被用户自己的设备缓存,中间代理不能存。
CDN缓存HTTPS资源要注意证书
现在很多网站用CDN加速,但如果你开了HTTPS,CDN节点要能正常缓存,必须确保SSL证书配置正确。有些老式CDN默认只缓存HTTP内容,HTTPS流量直接回源,结果就是你以为加速了,实际上每个请求都打到自己服务器上,白花钱。
解决办法是开启“HTTPS回源”并配置好证书信任链。同时在CDN后台确认是否支持SNI,否则多个HTTPS站点共用IP时可能出现握手失败。
避免在HTTPS页面引用HTTP资源
混用HTTP和HTTPS叫“混合内容”,现代浏览器会直接拦截这类请求。比如你一个HTTPS页面里写了<img src="http://xxx.com/logo.jpg">,图片很可能根本加载不出来,还可能报一堆警告。这不仅影响体验,还会导致缓存失效——因为资源没加载成功,自然没法进缓存。
正确的做法是所有资源都走HTTPS,哪怕是你自己内网的小图标服务器,也最好配个免费证书,统一协议。
本地开发也要注意缓存行为差异
不少人本地用HTTP调试,上线才切HTTPS,结果发现生产环境加载变慢。这是因为本地测试时浏览器缓存策略和线上不同。比如Chrome在HTTPS下对Service Worker的缓存更积极,而在HTTP下可能直接忽略。所以建议开发阶段就用HTTPS,可以用localhost的自签名证书配合webpack dev-server或vite的https配置。