web-dev-qa-db-ja.com

NGINXの「場所」ディレクティブの一致順序を制御する方法は?

'location'ディレクティブを最適化しようとしていますが、特定の場所の一致が試行されたかどうかを判断するための適切な方法が見つかりません。ロケーションブロック内でechoを使用しても、ここでは役に立ちません。

NGINX ngx_http_core_moduleドキュメント やや紛らわしいです。

正規表現を使用するには、プレフィックスを使用する必要があります。

  1. ~大文字と小文字を区別するマッチング用

  2. ~*大文字と小文字を区別しないマッチングの場合

試合の実施方法:

  1. クエリに完全に一致するプレフィックスが=のディレクティブ。見つかった場合、検索は停止します。

  2. 従来の文字列を使用した残りのすべてのディレクティブ。この一致で^~プレフィックスが使用されている場合、検索は停止します。

  3. 構成ファイルで定義されている順序の正規表現。

  4. #3が一致した場合、その結果が使用されます。それ以外の場合は、#2の一致が使用されます。

ここでの番号2は「従来の文字列」を示していますが、^~プレフィックスを付けて使用できることを示しています。 ~は正規表現を意味しませんか?そうでない場合、RegExpではないものをどのように判断しますか?

具体的には、次のものが必要です。

  1. リテラル/assetsから何でも直接提供します。検索を停止します。

  2. Fast-CGI STOPSEARCHを介してRegExp\.php$|/$に一致するものをすべて提供します。

  3. リテラル/を介して他のすべてを直接提供します

このように、アセットの外部から提供される非動的ファイルに対しては、/の一致試行のみが行われます。

私が持っています:

location ^~ /assets {}      # search-terminating literal? or regex?
location ~ \.php$|/$ {}
location / {}               # is this match always attempted?

ドキュメントからは、実際の順序は1-3-2であり、常にリテラル/一致を実行しているように見えます。はい、この最適化は実際のパフォーマンスには何の違いもありませんが、あいまいさを解消したいだけです。

17
leeoniya

ウィキから:

location  = / {
  # matches the query / only.
  [ configuration A ] 
}
location  / {
  # matches any query, since all queries begin with /, but regular
  # expressions and any longer conventional blocks will be
  # matched first.
  [ configuration B ] 
}

したがって、これが最初に照合されます:location ~ \.php$ {}

アセットはlocation / {}から提供されますが

Phpブロック内では、fastcgiに渡す前に悪意のあるアップロードから保護する必要もあります。

if ($uri ~* "^/uploads/") {
  return 404;
}

ご覧のとおり、nginxの動作は予想とは少し異なります。

7
m33lky