nginx需精准配置才能正确运行symfony项目:root必须指向public目录,显式声明index index.php;location /中try_files须带$query_string;php处理块要用$realpath_root并限定/index.php路径;最后拦截非法.php访问。

让Nginx正确解析Symfony项目,必须确保请求能精准命中public/下的index.php,同时静态资源不被PHP处理、查询参数不丢失、环境变量准确注入——错一个环节就会出现404、空白页或直接下载PHP文件。
确认项目结构与Nginx基础路径
进入你的Symfony项目根目录,执行ls -l public/,确认存在index.php和index.html。这是Symfony 5+的强制结构,【root必须精确指向public子目录,而非项目根目录】。
编辑Nginx主配置或站点启用文件,将root指令设为:root /var/www/your-symfony-app/public;。如果写成/var/www/your-symfony-app,favicon.ico、CSS、JS全部404,且/index.php根本不会被触发。
紧接着必须显式声明index index.php;。别以为try_files里写了/index.php就足够——没有这行,Nginx在访问/admin/这类无后缀路径时会拒绝匹配index.php,直接返回403或404。
配置location / 路由转发规则
在server块内添加以下location块:
location / {<br> try_files $uri $uri/ /index.php?$query_string;<br>}
这一步最关键:必须带$query_string,不能用$args,也不能省略。漏掉它,?page=3&sort=name这类参数进不了Symfony的Router,$_GET始终为空,所有路由匹配失败。
注意:不要用rewrite ^(.*)$ /index.php?$query_string last;。这种写法绕过try_files机制,会导致静态文件(如/build/app.css)也被强行转发给PHP,极大拖慢响应速度。
设置PHP处理器并传递关键环境变量
添加独立的PHP处理location,严格限定只匹配/index.php及其子路径:
location ~ ^/index\.php(/|$) {<br> fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;<br> fastcgi_split_path_info ^(.+\.php)(/.*)$;<br> include fastcgi_params;<br> fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;<br> fastcgi_param DOCUMENT_ROOT $realpath_root;<br> fastcgi_param APP_ENV prod;<br> fastcgi_param APP_DEBUG 0;<br> fastcgi_param HTTPS $https if_not_empty;<br>}
【SCRIPT_FILENAME必须用$realpath_root,不能用$document_root】。若项目路径含软链接(比如/var/www/app → /mnt/nfs/symfony-prod),$document_root会解析失败,导致“File not found”错误;$realpath_root自动展开符号链接,稳定可靠。
最后加一道安全拦截:
location ~ \.php$ {<br> return 404;<br>}
这条规则堵死所有非/index.php开头的.php文件访问,防止攻击者上传恶意脚本并直接执行。
启用配置并验证生效
第一步:检查语法是否合法:sudo nginx -t。报错立刻修正,别跳过。
第二步:重载Nginx服务:sudo systemctl reload nginx。
第三步:访问服务器IP或域名,观察是否显示Symfony欢迎页。若仍404,立即检查error.log中最后一行,通常暴露root路径错误或index.php权限问题。
第四步:创建一个测试路由,访问/test?foo=bar,在控制器中dump($_GET),确认foo值存在且未被截断。











