我需要在同一主机上安装多个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的使用相同的值。
/your/project/path/app_dev.php
rewrite ^/front/(.*)$ /$1 break;
)删除路径的开始时手动重新添加/front
rewrite ^/front/(.*)$ /$1 break;
/front/app_dev.php
。 这是最重要的部分。 Symfony将切断app_dev.php,并将其/front
到所有路由。