核心是浏览器复用旧静态文件,因url未变且服务端无失效信号;需先确认nginx直供静态资源(location顺序正确、响应头合规),再通过mix.version()哈希文件名、filemtime时间戳或nginx immutable三法强制更新url。

先确认静态资源真由 Nginx 直供
很多“缓存不刷新”其实是请求根本没走到静态文件,被 PHP 路由拦截了:
- Nginx 配置中
location ^~ /static/必须放在所有~ \.php$规则之前,否则请求被转发给 index.php,返回 404 或空白 - 用
curl -I https://yoursite.com/static/js/app.js检查响应头:
✅ 应有Content-Type: application/javascript和Cache-Control
❌ 若返回Content-Type: text/html或无缓存头,说明被 PHP 劫持,需修正alias(必须指向public/static,不能用root)
用 Mix.version() 生成内容哈希文件名(推荐)
Webpack/Vite 构建时自动重命名文件,URL 变化即触发浏览器重新下载:
- 在
webpack.mix.js末尾加.version(),运行npm run production后生成类似/static/js/app.js?id=7a2b9c的路径 - 哈希基于文件内容,内容不变 ID 不变,天然支持长期缓存(
Cache-Control: public, immutable) - Blade 中不用
asset(),改用{{ mix('js/app.js') }};ThinkPHP 无原生mix(),需手动封装:在app/Helper.php定义函数,读取public/mix-manifest.json返回真实路径
用 filemtime 时间戳做轻量兜底
适合未接入构建工具的小项目或临时调试:
- 模板中写:
<script src="/static/js/app.js?v=<?php%20echo%20filemtime(public_path('static/js/app.js'));%20?>"></script> -
public_path()必须返回物理路径(如/var/www/project/public/static/...),不能传 URL 路径(如/static/...),否则filemtime()报错 - 部署时确保 JS 文件和 HTML 模板同步上传,否则
v=值变了,服务端文件仍是旧的
配合 Nginx 启用 immutable 强缓存
在 Nginx 静态 location 块中加配置,让带哈希的资源永久缓存:
location ^~ /static/ { alias /path/to/public/static/; expires 1y; add_header Cache-Control "public, immutable"; }-
immutable告诉浏览器:只要 URL 不变,文件绝不会变,无需发条件请求(If-None-Match) - 该策略与
Mix.version()天然搭配,大幅提升重复访问性能
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











