try_filesはどのように機能しますか?


72

私はnginxのドキュメントを見ましたが、それでも私を全く混乱させます。

どのように機能しtry_filesますか?ドキュメントの内容は次のとおりです。

NginxHttpCoreModuleから

try_files

構文:try_files path1 [path2] uri

デフォルト:なし

コンテキスト:サーバー、場所

可用性:0.7.27

ファイルの存在を順番に確認し、見つかった最初のファイルを返します。末尾のスラッシュはディレクトリを示します-$ uri /。ファイルが見つからない場合、最後のパラメーターへの内部リダイレクトが呼び出されます。最後のパラメーターはフォールバックURIであり、存在している必要あります。存在し ない場合、内部エラーが発生します。書き換えとは異なり、フォールバックが名前付きの場所でない場合、$ argsは自動的に保持されません。引数を保存する必要がある場合は、明示的に保存する必要があります。

パスをどのようにチェックするのか理解できません。内部エラーを望まないが、別のファイルを見つけるためにパスの残りの部分を再開させる場合はどうすればよいですか?

キャッシュされたファイルを試してみたい場合、/path/app/cache/url/index.htmlそしてそれが試せない場合、/path/app/index.phpどのように書くのでしょうか?私が書いた場合:

try_files /path/app/cache/ $uri
include /etc/nginx/fastcgi_params;
fastcgi_pass unix:/var/run/php-fastcgi/php-fastcgi.socket;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;

私が持っていindex index.php index.html index.htm;ます。私が訪れたとき/urlname、それはチェックしようとし/path/app/cache/urlname/index.phpた後/path/app/cache/urlname/index.html?その後、すべてを無視すると、キャッシュフォルダーを確認try_filesできtry_filesますか?私はしようとして失敗しました。

回答:


64

try_filesは、定義されたルートディレクティブに関連して指定したリテラルパスを試行し、内部ファイルポインターを設定します。たとえば、を使用する場合try_files /app/cache/ $uri @fallback;index index.php index.html;次の順序でパスをテストします。

  1. $document_root/app/cache/index.php
  2. $document_root/app/cache/index.html
  3. $document_root$uri

最後に、@ fallbackという名前の場所に内部的にリダイレクトする前に。ファイルまたはステータスコード(=404)を最後のパラメーターとして使用することもできますが、ファイルを使用する場合は存在する必要があります

try_files自体は、最後のパラメーター以外の内部リダイレクトを発行しないことに注意してください。try_files $uri /cache.php @fallback;つまり、次のことはできません:nginxが内部ファイルポインターを$ document_root / cache.phpに設定して提供しますが、内部リダイレクトが行われないため、場所は再評価されず、そのようになりますプレーンテキストとして機能します。(インデックスとしてPHPファイルを使用するのは、インデックスディレクティブ内部リダイレクト発行するためです)


2
それは非常に明確です。ありがとう。名前付きの場所がどのように機能するのか少しわかりません。@fallbackにテキストではなくphpファイルとして機能するfastcgi phpの行がある場合 フォールバックは、すべてが失敗する前に使用されますか?

2
名前付きの場所は、error_pageやtry_filesなどの内部メカニズムを介してのみアクセスできることを除いて、通常の場所と機能的に同一です。try_filesのフォールバックは、指定されたパスのいずれも有効なファイルにならない場合にのみ使用されます。\ .php $ URIをキャッチする場所が必要です。そうしないと、ファイルが存在する場合にtry_filesが$ uriでトリガーされ、プレーンテキストとして提供されます。
マーティンフィヨルドヴァルド

この答えをありがとう..私はまだここに質問があります:try_filesはすぐに実行されますか、以前にネストされた場所が試行されますか?
スタンファン

@Stphaneあなたはここで濁った海に移動しています。nginxの継承は複雑で、乱雑で、完全に一貫性がありません。これを覚えておくためだけに古いノートを確認する必要があったので、保証はありませんが、try_filesの場合、特にネストされた場所のみを扱う場合、内部の場所が一致すると実行されないようです。ただし、テストすることをお勧めします。
マーティンフィヨルドヴァルド

5

try_filesのもう1つの便利な使用方法は、名前付きの場所への無条件リダイレクトです。名前付きの場所はサブルーチンとして効果的に機能し、コードの重複を防ぎます。try_filesの最初の引数が「_」の場合、フォールバックリダイレクトが常に使用されます。

    location =/wp-login.php { try_files _ @adminlock; }
    location ^~ /wp-admin/  { try_files _ @adminlock; }
    location @adminlock  {
            allow 544.23.310.198;
            deny all;
            try_files _ @backend;
            # wp-admin traffic is tiny so ok to send all reqs to backend 
    }
    location ~ \.php {  try_files _ @backend; }
    location / { try_files $uri $uri/ =403; }
    location @backend {
            fastcgi_pass 127.0.0.1:9000;
            include snippets/fastcgi-php.conf;
    }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.