Nginx 配置需确保 root 指向 web/ 目录,显式声明 index.php,用 try_files 正确转发请求,优先匹配静态资源路径避免 PHP 处理,并限制仅 index.php 可执行以保障安全。

Symfony 2 的公共资源(如 /web/bundles/、/web/css/、/web/js/ 等)默认放在 web/ 目录下,Nginx 若未正确配置,会直接返回 404 ——不是 Symfony 路由没匹配,而是 Nginx 根本没把请求交给 PHP 处理,更不会进入前端控制器。
确认 root 指向 web 目录
必须确保 Nginx 的 root 指令精准指向 Symfony 2 的 web/ 子目录,而非项目根目录:
- ✅ 正确:
root /var/www/my-symfony2-app/web; - ❌ 错误:
root /var/www/my-symfony2-app;(此时/css/app.css会 404,因为 Nginx 在项目根下找 css/ 目录)
显式声明 index 文件并启用 try_files
在 server 块中添加或检查以下基础配置:
-
index index.php;—— 必须显式声明,否则访问/admin/这类路径时无法自动命中index.php -
location / { try_files $uri $uri/ /index.php?$query_string; }——$query_string不可省略,否则 GET 参数丢失,路由解析失败
放行静态资源路径,避免被 PHP 拦截
Symfony 2 的公共资源(如 bundles、css、js、images)是真实存在的物理文件,应由 Nginx 直接返回,不经过 PHP:
- 添加独立 location 块,优先匹配常见静态后缀:
- 该块必须放在
location /之前(Nginx 匹配按顺序),确保/bundles/acmefoo/js/app.js这类请求直接读取文件,不走index.php - 若遗漏此配置,所有静态资源都会被
try_files转发到/index.php,导致 404 或空白响应
拦截非法 PHP 文件访问
为安全起见,禁止用户直接访问 web/ 下除 index.php 外的其他 PHP 文件:
- location ~ \.php$ { if ($fastcgi_script_name !~ ^/index\.php) { return 403; } include fastcgi_params; fastcgi_pass php-fpm-upstream; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; fastcgi_param DOCUMENT_ROOT $realpath_root; }
- 使用
$realpath_root而非$document_root,防止路径解析绕过 -
if判断确保只有/index.php可执行,其他如/config.php或/app_dev.php(开发环境)均被拒绝











