发布脚本用 cp -p 覆盖 app.js,文件内容变了,Last-Modified 还是三天前的值,客户端带 If-Modified-Since 请求,服务端返回 304。碰到这种情况,我一般先确认改动有没有真的生效。
原因不复杂,cp -p 会保留源文件的修改时间,服务端按 mtime 生成 Last-Modified,看到的时间没变就认为文件没改。内容已经换了,协商结果却是未修改。
「mtime 未更新」这类改动最怕改一半,回滚脚本先准备好,再动生产。报错里带路径的,先去看那个路径在不在、权限对不对。
cp app.js /var/www/static/app.js curl -sI http://127.0.0.1/static/app.js | grep -i last-modified md5sum app.js /var/www/static/app.js
同一份配置存在多处的,先确认改的是被加载的那一份。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。
备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。
具体做法是,发布时不要保留时间戳 改用普通 cp 或 rsync 不带 -t;生成资源时按内容哈希重命名 让 URL 变化;服务端 Last-Modified 改用构建时间;验证时对比文件 md5 和响应头里的时间。
最后用这个标准收尾,覆盖后 Last-Modified 变成当前时间 带旧 If-Modified-Since 的请求返回 200 和新内容。
