ThinkPHP 8 静态资源404的根本原因是Nginx未正确指向public目录或未精准映射/static/路径;需设置root为绝对路径/public、用alias单独配置/static/、模板中使用asset()生成链接,并在开启强制路由时放行静态资源。

ThinkPHP 8 静态资源访问失败,根本原因不是路径写错了,而是 Nginx 没把请求准确落到 public/ 目录下的真实文件上。CSS、JS、图片返回 404,但 /index.php/static/css/app.css 能打开,就说明 PHP 路由通了,只是静态资源没被直出——这完全是服务器配置问题。
确保 root 明确指向 public 目录
Nginx 的 root 必须设为项目 public 子目录的绝对路径,不能是项目根目录(含 app、config 等文件夹)。
-
正确写法:
root /var/www/myapp/public;(Linux)或root D:/www/myapp/public;(Windows) -
错误写法:
root /var/www/myapp;—— 这会让/static/css/app.css去找/var/www/myapp/static/...,而实际文件在/public/static/... - 宝塔用户:网站设置 → 「运行目录」必须选
/public,改完要重启 Nginx
静态资源用 alias 精准映射
即使 root 已设对,若部署在子目录或需更高控制力,建议单独为 /static/ 配置 alias,避免路径拼接歧义。
-
推荐配置:
location ^~ /static/ { alias /var/www/myapp/public/static/; } - 注意:
alias后路径末尾必须带斜杠,且不拼接 location 路径 - 别混用
root和alias:比如location /static/ { root /var/www/myapp; }会去找/var/www/myapp/static/,仍然错
模板中必须用 asset() 生成链接
手写 <link href="/static/css/app.css"> 在子目录、二级域名或 HTTPS 下极易失效;__STATIC__ 等常量也不再推荐。
立即学习“PHP免费学习笔记(深入)”;
-
正确写法:
<link href="{{ asset('static/css/app.css') }}"> -
asset()参数不加public/前缀,它默认从public开始查找 - Linux 下严格区分大小写:
Static/≠static/,路径错一个字母就是 404
开启强制路由时要放行静态资源
若设置了 'url_route_must' => true,所有请求都必须匹配路由规则,否则直接 404。默认情况下,/static/xxx 不会被识别为静态文件,会被当成需要路由的地址拦截。
- 在路由定义中添加放行规则:
Route::alias('static', 'static'); - 或通过后缀规则允许:
Route::rule('static/:file', 'static/index')->ext('css|js|png|jpg|gif'); - 也可在 Nginx 层提前截断,不让请求进 PHP:上面的
location ^~ /static/就已实现该效果



















