ThinkPHP 8.0 在 Nginx 下伪静态必须排除静态文件:优先用正则匹配后缀(如 css/js/png),再用前缀匹配静态目录(如 /static/),最后主路由仅处理非静态请求;避免将静态规则写入 location / 或 php 块内,禁用 if 判断,确保 root 指向 public/。

ThinkPHP 8.0 在 Nginx 下做伪静态时,排除静态文件不是可选项,而是必须动作。否则每次请求 logo.png、app.js 或 font.woff 都会绕一圈进 PHP,既拖慢响应,又浪费 CPU 和内存。
核心原则是:让 Nginx 自己处理真实存在的静态资源,只把真正需要路由解析的动态请求交给 index.php。
✅ 优先匹配静态后缀(最常用、最高效)
在 server 块中,把这段规则放在 location / { } 之前(Nginx 按顺序匹配,靠前优先):
location ~* \.(?:css|js|png|jpe?g|gif|webp|woff2?|ttf|eot|mp4|mp3|pdf|svg|ico)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
说明:
-
~*表示不区分大小写正则匹配,命中即终止后续 location 查找; - 不用
try_files $uri =404——多一次磁盘判断,纯属冗余;只要文件物理存在,Nginx 就能直接返回; -
expires 1y和Cache-Control启用强缓存,浏览器和 CDN 都会复用,大幅提升加载速度。
✅ 单独拦截静态目录(适合集中存放场景)
如果你把所有前端资源统一放在 /public/static/ 或 /public/dist/ 下,推荐用前缀匹配(比正则更快):
location ^~ /static/ {
alias /www/wwwroot/myapp/public/static/;
expires 1y;
add_header Cache-Control "public, immutable";
}
注意点:
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
-
^~表示“前缀匹配且最高优先级”,性能优于正则; -
alias后路径末尾不能加斜杠(如/static/对应alias /path/to/static;),否则拼接出错导致 404; - 确保该路径不在
location /的重写范围内——它必须独立存在且位置靠前。
✅ 主路由只处理“非静态”请求
完成上述两步后,你的 location / 才能干净地只负责动态逻辑:
location / {
try_files $uri $uri/ /index.php?$query_string;
}
含义很明确:
-
$uri:查真实文件(已被上面规则提前拦走); -
$uri/:查真实目录(比如/admin/存在就直接列目录或找 index.html); -
/index.php?$query_string:前面都不命中,才交由 ThinkPHP 解析路由。
此时,/user/login、/api/v1/data 这类地址才会进 PHP;而 /static/css/app.css、/uploads/avatar.jpg 已被前面规则截获,根本不会触发这一行。
❌ 常见错误要避开
- 把静态规则写在
location /里面(无效,语法虽通但不执行); - 在
location ~ \.php$块里加静态判断(压根不匹配.js.png请求); - 用
if (!-e $request_filename)包裹静态判断(Nginx 官方已明确不推荐,易引发 PATH_INFO 丢失、白屏); - 忘记
root指向public/目录(会导致alias路径错位、静态文件 404)。
不复杂但容易忽略。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










