我需要在同一主机上但在不同的子目录(或位置块)上安装多个symfony2应用程序。
有了这个配置,nginx在尝试访问任何url时会抛出一个"找不到文件"或重定向循环消息。
示例:
/login -> /base/login
/app1 -> /base/app1
/app2 -> /base/app2
当前配置:
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/*以外的其他文件进行web访问)。
它适用于php-fpm(socket)。
当然,将"{subdir}"替换为您的/path/from/docroot/to/symfony_root/
dev-environment可以通过在"{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。在这里,我们必须在路径的开头手动重新添加
/front
,因为它已被文件服务位置删除(通过rewrite ^/front/(.*)$ /$1 break;
) - SCRIPT_NAME:值为
/front/app_dev.php
。这是最重要的部分。Symfony将剪切app_dev.php并将/front
预先发送到其所有路由
基于dcaillibaud的答案,这里有一个更通用的配置,允许在根web路径下支持多个Symfony(版本2或3)项目,使用一些正则表达式魔术:
server {
# other specific directives...
root /var/www;
location ~ ^/([^/]+)/dev(/.*)$ {
location ~ .php { deny all; }
set $sf2_root /$1;
set $sf2_prefix /$1/dev;
set $sf2_ctrl app_dev.php;
expires off;
try_files $sf2_root/web$2 @sf2;
}
location ~ ^/([^/]+)(/.*)$ {
location ~ .php { deny all; }
set $sf2_root /$1;
set $sf2_prefix /$1;
set $sf2_ctrl app.php;
try_files $sf2_root/web$2 @sf2;
}
location @sf2 {
expires off;
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
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$2;
}
}
因此,基本上,您将拥有:www.domain.com/project指向您的PROD环境和www.domain.com/project/dev指向您的dev环境
请更换线路:fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;使用合适的后端
这也可以很容易地适用于使用index.php脚本而不是app(_dev).php的新Symfony项目,更改web/public路径,并设置一些ENV变量。
我认为这种方法,更好地回答了原来的问题。