web-dev-qa-db-ja.com

場所のパスのNginxワイルドカード/正規表現

私が持っている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;
}

場所にパス名を正規表現またはワイルドカードとして含める方法はありますか?

25
user156477

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

正規表現を試みると、[a-z]azの間の1文字と一致します。それがあなたにとってうまくいかない理由です。

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

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

location ~ \.php$ {
    return 404;
}

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

2番目は、.phpで終わるすべてのURIに一致します。正規表現の仕組みにより、バージョンに追加の文字は必要ありません。

32
Tero Kilkanen

順序は重要です nginxの「場所」の説明

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

その意味は:

  • 最初 =。 (「最長一致接頭辞」一致)
  • 次に暗黙的なもの。 (「最長一致接頭辞」一致)
  • 次に正規表現。 (最初の一致)

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

1
Gea-Suan Lin