如何在nginx的子目录中安装symfony2应用程序

我需要在同一主机上安装多个symfony2应用程序,但在不同的子目录(或位置块)上。

有了这个configuration,当试图访问任何url时,nginx会抛出一个“找不到文件”或redirect循环消息。

例:

/login -> /base/login /app1 -> /base/app1 /app2 -> /base/app2 

当前configuration:

 root /base/default; #Points to an empty directory # Login Application location ^~ /login { alias /base/login/web; try_files $uri app_dev.php; } # Anything else location ~ ^/([\w\-]+) { alias /base/$1/web; try_files $uri app_dev.php; } location / { # Redirect to the login rewrite ^ /login redirect; } # Handle PHP location ~ \.php$ { include fastcgi_params; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info; fastcgi_param HTTPS off; fastcgi_pass unix:/var/run/php5-fpm.sock; } 

经过几个小时的时间才发现这个(sf2 doc没有解释如何cgi参数是需要和解释的,你需要通过Request.php去了解),所以我分享这个。

这是一个配置,在目录{subdir}中可以与sf2配合使用(并且禁止对{subdir} / web / *之外的其他文件进行网络访问)。

它适用于我的php-fpm(套接字)。

当然,用/ path / from / docroot / to / symfony_root /替换“{subdir}”,

开发环境可以通过在“{subdir}”中添加“dev”来选择(因为url中的app_dev.php不再适用于这个conf)

 server { # general directives location ~ ^/{subdir}(/.*)$ { try_files /{subdir}/web$1 @sf2; } location ~ ^/{subdir}dev(/.*)$ { expires off; try_files /{subdir}/web$1 @sf2dev; } location @sf2 { expires off; fastcgi_pass {your backend}; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root/{subdir}/web/app.php; fastcgi_param SCRIPT_NAME /{subdir}/app.php; fastcgi_param REQUEST_URI /{subdir}$1; } location @sf2dev { expires off; fastcgi_pass {your backend}; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root/{subdir}/web/app_dev.php; fastcgi_param SCRIPT_NAME /{subdir}dev/app_dev.php; fastcgi_param REQUEST_URI /{subdir}dev$1; } # other location directives # if some others apps needs php, put your usual location to cactch php here } 

我希望这有助于(没有任何错误配置),给予没有任何保证…

当然,如果你不需要,你可以选择prod / dev conf。 而且你可以使用var和只有一个@ sf2位置来代替:

  set $sf2_root /{subdir}; location ~ ^/{subdir}(/.*)$ { set $sf2_prefix /{subdir}; set $sf2_ctrl app.php; try_files $sf2_root/web$1 @sf2; } location ~ ^/{subdir}dev(/.*)$ { set $sf2_prefix /{subdir}dev; set $sf2_ctrl app_dev.php; expires off; try_files $sf2_root/web$1 @sf2; } location @sf2 { expires off; fastcgi_pass {your backend}; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$sf2_root/web/$sf2_ctrl; fastcgi_param SCRIPT_NAME $sf2_prefix/$sf2_ctrl; fastcgi_param REQUEST_URI $sf2_prefix$1; } 

这是“/ front /”子目录下symfony2的一个更简单的配置。 路线生成和资产正常工作。

配置

 set $frontRoot /your/project/path/web; set $sfApp app_dev.php; # Change to app.php for prod location /front/ { # Static files root $frontRoot; rewrite ^/front/(.*)$ /$1 break; try_files $uri @sfFront; } location @sfFront { # Symfony fastcgi_pass phpfcgi; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $frontRoot/$sfApp; fastcgi_param SCRIPT_NAME /front/$sfApp; fastcgi_param REQUEST_URI /front$uri?$args; fastcgi_param HTTPS off; } 

一些解释

诀窍是让symfony相信app.php脚本在/ front /中,所以它会用这个路径生成路由和资产。

我看了一下Apache给MOD-PHP的使用相同的值。

  • SCRIPT_FILENAME:PHP文件的绝对路径。 这里总是/your/project/path/app_dev.php
  • REQUEST_URI:用户输入的URI。 在这里,我们必须在文件服务位置(通过rewrite ^/front/(.*)$ /$1 break; )删除路径的开始时手动重新添加/front rewrite ^/front/(.*)$ /$1 break;
  • SCRIPT_NAME:值为/front/app_dev.php 。 这是最重要的部分。 Symfony将切断app_dev.php,并将其/front到所有路由。