5

複数の symfony2 アプリケーションを同じホストにインストールする必要がありますが、異なるサブディレクトリ (またはロケーション ブロック) にインストールする必要があります。

この構成では、任意の URL にアクセスしようとすると、nginx は「ファイルが見つかりません」またはリダイレクト ループ メッセージをスローします。

例:

/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 で問題ないように見える構成です (また、{subdir}/web/* 以外のファイルへの Web アクセスは禁止されています)。

php-fpm(ソケット)で動作します。

もちろん、"{subdir}" を /path/from/docroot/to/symfony_root/ に置き換えます

開発環境は、「dev」を「{subdir}」に追加することで選択できます (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 と 1 つの @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 に答える