Nginx $ document_root $ fastcgi_script_name vs $ request_filename


16

設定ファイルに設定した場合、違いに気付かない

 fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;

または:

 fastcgi_param  SCRIPT_FILENAME    $request_filename;

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

前もって感謝します。

回答:


24

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

$ request_filename

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

$ document_root

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

$ fastcgi_script_name

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

ここに書いたように、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を参照してください。


これは真実ではないようです(少なくともそうではありません)。Steely Wingの回答をご覧ください。
リマスクデリス

@RimasKudelis私はこれをかなり長い間使用していませんが、ドキュメントは変更されていないので、まだ動作することを期待しています-あなたfastcgi_split_path_infoの微調整が必​​要かもしれません。Steely Wingの答えは、ドキュメントではなく、経験にのみ基づいているようです。
SimonSimCity

はい、私のコメントも経験に基づいています。fastcgi_split_path_info2つのキャプチャの外にエイリアスプレフィックスを配置するように調整してみましたが、効果はないようです。一方、別名を使用するかどうかに関係なく、$request_filenameとして渡すことSCRIPT_FILENAMEは魅力のように機能します。
リマスクデリス

実際、NginXのドキュメントが、追加の追加なしで解決された実際のファイル名が含まれているSCRIPT_FILENAME場合、最初に2つの文字列を連結することを提案する理由さえ理解できません$request_filename。上記の例は実際には正しくあり$request_filenameません。実際には、ファイルが明示的に要求されていなくても、単なるパスではなくファイル名が含まれているためです。少なくとも昨日の時点での私の結論です。
リマスクデリス

7

TLDR

私が使用することを推奨$request_filenameするためにSCRIPT_FILENAME


rootディレクティブを使用する場合

$document_root$fastcgi_script_nameに等しい$request_filename

aliasディレクティブを使用する場合

$document_root$fastcgi_script_nameはに$fastcgi_script_name関連するパスではなく、URLのパスであるため、間違ったパスを返します$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_filenameindexディレクティブを使用してインデックスを設定する必要がありますが、機能しfastcgi_indexません。


2

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

基本的SCRIPT_FILENAMEに、vhostファイルでルートディレクティブを定義したときに既に定義されているため、エラーが発生することはありません 。そのため、vhostファイルで明示的に定義した場合を除きfastcgi_param、の値を使用SCRIPT_FILENAMEしてrootディレクティブから取得されます。リクエストをphpサーバーに送信するためにnginxが必要とする別の変数があります。これは$fastcgi_script_name、URLの繰り返しや、スラッシュで終わるURIのエラーを避けるために適切に定義する必要があります。

結論

すべてが非常にうまく機能するように、誰もがSCRIPT_FILENAME/ etc / nginxフォルダーにある「fastcgi_params」ファイルで明示的に定義するか、phpロケーションブロックに次の行を含めることにより、sites-availableフォルダーにあるサイトのvhostで簡単に定義する必要があります:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

または、先ほど書いたように 'fastcgi_params'ファイルに含まれていますが、どちらの場合も同じです。

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

それが将来の誰かを助けることを願っています。それを理解するのに多くの時間がかかったからです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.