location ~* \.(css|js|woff2)$ {
gzip off;
etag on;
add_header Cache-Control 'public, max-age=31536000, immutable';
}
静态资源明明没改,每次刷新都返回 200 全量下载,响应头里的 ETag 多了个 W/ 前缀,Cache-Control 像没生效一样。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,Nginx 对压缩后的响应会生成弱 ETag,和浏览器缓存里的强 ETag 不匹配,协商缓存直接失效。前面再加一层 CDN 改写头,就对得更不上。
这次卡住的地方就在「ETag 弱校验」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。改完隔一天再看一次,当场正常不代表能稳住。
测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。
处理上按这个顺序:先看响应头的 ETag 是强校验还是弱校验 带 W/ 就是弱;关掉对静态资源的动态压缩 改用构建时预压缩;确认只有一层在改 ETag CDN 和源站别同时改写。
改完只确认一件事:第二次访问返回 304,响应体为空,传输体积明显下降。
