ThinkPHP 8.0 不提供静态资源缓存过期时间的直接配置,因缓存控制由 Web 服务器(如 Nginx)和浏览器决定;关键在于通过哈希文件名或时间戳使 URL 变化,并配合 Nginx 的 expires 和 Cache-Control 响应头实现有效缓存。

先确认静态资源是否真由 Web 服务器直供
如果请求被 PHP 路由拦截(比如返回 404 或 text/html),那所有缓存策略都无效。检查两点:
- Nginx 配置中
location ^~ /static/必须写在所有~ \.php$规则之前 -
alias指向public/static的绝对路径,不能用root拼接
验证方式:curl -I https://yoursite.com/static/css/app.css,应返回 Content-Type: text/css 和有效的 Cache-Control 头。
用哈希文件名实现长期缓存(推荐)
这是最可靠、最符合现代前端实践的方式:文件内容一变,URL 就变,浏览器自然弃旧取新。
- 在
webpack.mix.js末尾加.version(),构建后生成/static/css/app.css?id=abc123类似路径 - Blade 中不用
asset(),改用自定义mix()函数读取mix-manifest.json映射 - Nginx 可配
expires max;+add_header Cache-Control "immutable";,告诉浏览器“这链接永久有效”
用时间戳做轻量级更新标识
适合无构建工具的小项目,但要注意路径必须是真实物理路径:
立即学习“PHP免费学习笔记(深入)”;
- 模板中写:
<link rel="stylesheet" href="/static/css/app.css?v=<?php echo filemtime(public_path('static/css/app.css')); ?>"> -
public_path()返回的是服务器上的绝对路径(如/var/www/project/public/static/...),不是 URL - 每次文件修改,
v值就变,浏览器视为新请求
服务端响应头要配合(Nginx 示例)
即使 URL 带哈希或时间戳,若响应头禁止缓存,性能就白费。建议 Nginx 静态 location 块中加入:
-
expires 1y;—— 对哈希文件设一年有效期 -
add_header Cache-Control "public, immutable";—— 强制长期缓存且不可覆盖 - 对未哈希的通用路径(如
/static/uploads/),可设expires 1h;防止误传



















