ロケーションパスのNginxワイルドカード/正規表現


22

私が持っているNginxの設定は、次の.phpように404を投げます:

## Any other attempt to access PHP files returns a 404.
location ~* ^.+\.php$ {
    return 404;
}

ただし、実行したいサブフォルダーにindex.phpファイルがあります。現在の設定は次のとおりです。

location = /sitename/subpage/index.php {
    fastcgi_pass phpcgi; #where phpcgi is defined to serve the php files
}

location = /sitename/subpage2/index.php {
    fastcgi_pass phpcgi; 
}

location = /sitename/subpage3/index.php {
    fastcgi_pass phpcgi; 
}

それは完全に機能しますが、問題は場所の重複であり、サブページが多数ある場合、構成は巨大になります。

*のようなワイルドカードといくつかの正規表現を試してみました。nginxテストは合格しましたが、ページ、つまり404は読み込まれません。

location = /sitename/*/index.php {
    fastcgi_pass phpcgi;
}

location ~* ^/sitename/[a-z]/index.php$ {
    fastcgi_pass phpcgi;
}

正規表現またはワイルドカードとして場所にパス名を持つことができる方法はありますか?

回答:


32

ブロック=内の修飾子はlocation完全一致であり、ワイルドカード、プレフィックス一致、または正規表現は含まれません。それが動作しない理由です。

正規表現の試行で、との[a-z]間の1文字に一致します。それがあなたのために機能しない理由です。az

次のように場所を設定する必要があります。locationステートメントの順序に注意してください。nginxは、最初に一致した正規表現条件を選択します。

location ~ ^/sitename/[0-9a-z]+/index.php$ {
    fastcgi_pass phpcgi;
}

location ~ \.php$ {
    return 404;
}

ここでは大文字と小文字を区別するマッチングを使用します(~ではなく修飾子~*)。最初のケースでは、パスの最初の部分、次に1つ以上のアルファベット/数字の文字、次にを照合しindex.phpます。一致範囲を変更できますが+、「1回以上」の繰り返しを覚えておいてください。

2番目は、で終わるURIと一致し.phpます。正規表現が機能するため、バージョンに余分な文字は必要ありません。


おかげで、はい、正規表現から繰り返しの主なものが欠落していました。+それを修正しました。

1

nginxの「場所」の説明から、順序は重要です。

特定の要求に一致する場所を見つけるために、nginxは最初にプレフィックス文字列(プレフィックスの場所)を使用して定義された場所を確認します。その中で、最も長いプレフィックスを持つ場所が選択され、記憶されます。次に、構成ファイルでの出現順に正規表現がチェックされます。正規表現の検索は最初の一致で終了し、対応する構成が使用されます。正規表現と一致するものが見つからない場合は、以前に記憶されたプレフィックスロケーションの設定が使用されます。

その意味は:

  • 最初に=。(「最長一致プレフィックス」一致)
  • その後、暗黙的なもの。(「最長一致プレフィックス」一致)
  • 次に正規表現。(最初の一致)

正規表現パーツの順序を調整する必要があります。

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