必须将nginx的root指向public目录且显式声明index index.php;location /中try_files需带$query_string;php处理块须用$realpath_root并限定/index.php路径,否则导致404、空白页或php文件被下载。

要让 Symfony 新项目在 Nginx 下正常运行,不能直接把项目根目录当 Web 根,必须从结构起点就对齐框架规范,并同步完成 Nginx 的最小可行配置。核心是三件事:确认 public 目录为唯一入口、Nginx root 精准指向它、PHP 请求严格路由到 index.php。
初始化 Symfony 项目并验证 public 结构
使用 Composer 创建标准骨架(推荐 website-skeleton):
- 运行
composer create-project symfony/website-skeleton myapp - 进入项目后执行
ls -l myapp/public/,确保存在index.php和index.html - 不要手动移动或重命名 public 目录——这是 Symfony 5+ 强制约定,破坏它会导致全部静态资源 404,且路由无法启动
设置 Nginx 的 root 与 index 指令
Nginx 配置中 server 块必须显式指定两处关键值:
-
root /var/www/myapp/public;—— 注意路径末尾是 public,不是项目根目录 -
index index.php;—— 必须写明,否则访问/admin这类无后缀路径时不会自动尝试 index.php,直接返回 403 或 404
配置 location / 转发规则(带查询参数)
在 server 块内添加以下 location 块,确保请求能正确落入前端控制器:
location / { try_files $uri $uri/ /index.php?$query_string; }- 必须用
$query_string,不是$args,也不是省略——漏掉它,?page=2&sort=name就进不了 Symfony 的 Request 对象 - 禁止使用 rewrite 全局跳转,那会让 CSS/JS 也走 PHP,严重拖慢响应
声明 PHP 处理器并限定作用范围
单独定义一个 location 块,只处理以 /index.php 开头的请求:
-
location ~ ^/index\.php(/|$) { ... }—— 正则严格匹配,避免误伤其他 .php 文件 - 使用
$realpath_root计算 SCRIPT_FILENAME,防止符号链接导致路径错误 - 注入环境变量如
APP_ENV=prod和APP_DEBUG=0,避免开发配置泄露到生产











