Symfony项目Twig加载CSS出现404错误,请求排查原因
你的问题核心在于静态资源的目录结构和Nginx配置不匹配,具体原因和解决方案如下:
问题根源
你的Nginx配置中root指向的是项目的public目录:
root /var/www/html/backoffice/public;
这意味着Nginx只会从public目录下查找所有静态资源请求。但你的assets文件夹是放在项目根目录(/var/www/html/backoffice/),而不是public目录内。当浏览器请求assets/bootstrap/dist/css/bootstrap.min.css时,Nginx会去/var/www/html/backoffice/public/assets/...路径下查找文件,这个路径根本不存在,所以返回404错误。
推荐解决方案
方案1:遵循Symfony规范移动资源目录(最推荐)
Symfony的最佳实践是将所有静态资源放在public目录下,这样Nginx可以直接访问,asset()函数也能正确解析路径。你只需要把根目录下的assets文件夹移动到public目录中,不需要修改任何代码,刷新页面就能正常加载CSS了。
方案2:使用Symfony的assets命令创建软链接
如果不想移动文件夹,可以通过Symfony内置的命令将assets目录软链接到public目录,这样既保留原目录结构,又能让Nginx访问到资源:
php bin/console assets:install public --symlink
执行这个命令后,public目录下会生成一个指向根目录assets的软链接,此时asset('assets/bootstrap/dist/css/bootstrap.min.css')就能正确生成可访问的路径。
方案3:修改Nginx配置(不推荐)
如果你一定要保留assets在根目录,可以给Nginx添加一个专门处理/assets请求的location规则:
server { server_name yventee-backoffice.local; root /var/www/html/backoffice/public; # 新增这个location处理根目录的assets请求 location ^~ /assets/ { root /var/www/html/backoffice; try_files $uri =404; } # 原有的location规则... location / { try_files $uri /index.php$is_args$args; } # ...其他配置 }
不过这种方法会打破Symfony的目录规范,可能带来安全隐患,所以仅作为临时解决方案,不推荐长期使用。
额外检查
确认你的asset()函数路径没有拼写错误,比如不要写成asset('/assets/...')(开头多了斜杠),保持asset('assets/...')的写法即可。
内容的提问来源于stack exchange,提问作者iamjc015

