18

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

NGINX ngx_http_core_module のドキュメントはやや混乱しています。

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

  1. ~大文字と小文字を区別する一致の場合

  2. ~*大文字と小文字を区別しない一致の場合

試合の進行方法:

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

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

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

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

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

具体的には、以下が欲しいです。

  1. 文字どおりのもの/assetsを直接提供します。検索を停止します。

  2. \.php$|/$高速 CGI STOP SEARCH を介してRegExp に一致するものをすべて提供します。

  3. 他のすべてをリテラル経由で直接提供する/

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

私は持っている:

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

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

4

1 に答える 1

8

ウィキから:

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の動作は予想とは少し異なります。

于 2011-12-09T02:19:58.110 に答える