web-dev-qa-db-ja.com

Nginx $ document_root $ fastcgi_script_nameと$ request_filename

設定ファイルに設定しても違いに気付かない

 fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;

または:

 fastcgi_param  SCRIPT_FILENAME    $request_filename;

彼らはそれぞれ何をしますか? 2つのうちの1つは他よりも優れていますか?

前もって感謝します。

16

ドキュメントの内容は次のとおりです。

$ request_filename

この変数は、現在のリクエストのファイルへのパスに等しく、ディレクティブrootまたはエイリアスとURIリクエストから形成されます。

$ document_root

この変数は、現在のリクエストのディレクティブrootの値と同じです。

$ fastcgi_script_name

この変数は、URIリクエストに等しいか、URIがスラッシュで終わっている場合は、URIリクエストとfastcgi_indexで指定されたインデックスファイルの名前に等しいです。特にPHPでスクリプトの名前を決定するために利用されるSCRIPT_FILENAMEとPATH_TRANSLATEDの両方の代わりにこの変数を使用することが可能です。

ここに書かれているように、fastcgi_indexまたはfastcgi_split_path_infoを使用すると、少なくとも違いがあります。たぶんもっとあるかもしれません...それが今私が知っていることです。

リクエスト/info/を取得し、次の構成を使用します。

fastcgi_index  index.php;
fastcgi_param  SCRIPT_FILENAME  /home/www/scripts/php$fastcgi_script_name;

SCRIPT_FILENAME/home/www/scripts/php/info/index.phpと等しくなりますが、$request_filenameを使用すると/home/www/scripts/php/info/になります。

fastcgi_split_path_infoの設定も重要です。さらにヘルプが必要な場合は、こちらをご覧ください: http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_split_path_info

24
SimonSimCity

TLDR

_$request_filename_には_SCRIPT_FILENAME_の使用をお勧めします。


rootディレクティブを使用している場合

_$document_root$fastcgi_script_name_は_$request_filename_と同じです。

aliasディレクティブを使用している場合

_$document_root$fastcgi_script_name_はURLのパスであり、_$fastcgi_script_name_に関連するパスではないため、_$document_root_は誤ったパスを返します。

設定がある場合

_location /api/ {
    index  index.php index.html index.htm;
    alias /app/www/;
    location ~* "\.php$" {
        try_files      $uri =404;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        # fastcgi_param  SCRIPT_FILENAME  $request_filename;
    }
}
_

リクエスト_/api/testing.php_:

  • _$document_root$fastcgi_script_name_ == _/app/www//api/testing.php_
  • _$request_filename_ == _/app/www/testing.php_

リクエスト_/api/_:

  • _$document_root$fastcgi_script_name_ == _/app/www//api/index.php_
  • _$request_filename_ == _/app/www/index.php_

また、_$request_filename_を使用する場合は、indexディレクティブを使用してインデックスを設定する必要があります。_fastcgi_index_は機能しません。

7
Steely Wing

これらの行は「fastcgi_params」ファイルから取得されたと思います。

基本的に、SCRIPT_FILENAMEに関しては、vhostファイルでルートディレクティブを定義したときに既に定義されているため、エラーは発生しません。したがって、fastcgi_paramを使用してvhostファイルで明示的に定義しない限り、SCRIPT_FILENAMEの値はrootディレクティブから取得されます。ただし、ここで重要なポイントが1つあります。 nginxが$fastcgi_script_nameであるphpサーバーにリクエストを送信するために必要な別の変数があり、スラッシュで終わるURIの反復URLとエラーを回避するために、それをうまく定義する必要があります。

結論

すべてが非常にうまく機能するように、誰もがSCRIPT_FILENAMEを/ etc/nginxフォルダーにある 'fastcgi_params'ファイルに明示的に定義するか、次の行をphpロケーションブロック:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

または、上記で記述したように「fastcgi_params」ファイルに含まれています。どちらの方法でも同じです。ngnixをPHP-FPMに接続するための詳細については、次のURLにアクセスしてください。

https://www.nginx.com/resources/wiki/start/topics/examples/phpfcgi/

私はそれが将来的に誰かを助けることを願っています。

2
Dr.SMS