5

我需要在同一主机上但在不同的子目录(或位置块)上安装多个 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;
}
4

3 回答 3

16

花了几个小时才找到这个(sf2 doc没有解释如何需要和解释cgi参数,你需要通过Request.php来理解),所以我分享这个。

这是一个配置,在目录 {subdir} 中使用 sf2 似乎没问题(并且禁止通过 Web 访问除 {subdir}/web/* 之外的其他文件)。

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

当然,用你的 /path/from/docroot/to/symfony_root/ 替换 "{subdir}"

可以通过将“dev”添加到“{subdir}”来选择开发环境(因为 url 中的 app_dev.php 不再适用于此配置)

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;
  }
于 2012-10-24T14:39:42.463 回答
4

这是“/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添加到它的所有路由中。
于 2015-02-01T23:48:56.923 回答
0

根据 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; 使用适当的后端

这也可以很容易地适应新的 Symfony 项目,使用 index.php 脚本而不是 app(_dev).php,更改 web/public 路径,并设置一些 ENV 变量。

我认为这种方法可以更好地回答原始问题。

于 2021-11-18T18:58:06.557 回答