私が持っている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;
}
場所にパス名を正規表現またはワイルドカードとして含める方法はありますか?
location
ブロックの=
修飾子は完全一致であり、ワイルドカード、プレフィックス一致、または正規表現はありません。それが機能しない理由です。
正規表現を試みると、[a-z]
はa
とz
の間の1文字と一致します。それがあなたにとってうまくいかない理由です。
次のように場所を設定する必要があります。 location
ステートメントの順序に注意してください。 nginxは、最初に一致する正規表現条件を選択します。
location ~ ^/sitename/[0-9a-z]+/index.php$ {
fastcgi_pass phpcgi;
}
location ~ \.php$ {
return 404;
}
ここでは大文字と小文字を区別するマッチングを使用します(~
の代わりに~*
修飾子)。最初のケースでは、パスの最初の部分、次に1つ以上のアルファベット/数字文字、次にindex.php
を照合します。一致範囲は変更できますが、「1回以上」の繰り返しの+
を忘れないでください。
2番目は、.php
で終わるすべてのURIに一致します。正規表現の仕組みにより、バージョンに追加の文字は必要ありません。
順序は重要です nginxの「場所」の説明 :
特定のリクエストに一致する場所を見つけるために、nginxは最初にプレフィックス文字列を使用して定義された場所(プレフィックスの場所)をチェックします。その中で、一致するプレフィックスが最も長い場所が選択され、記憶されます。次に、構成ファイルでの出現順に正規表現がチェックされます。正規表現の検索は最初の一致で終了し、対応する構成が使用されます。正規表現との一致が見つからない場合は、前に記憶されたプレフィックスの場所の構成が使用されます。
その意味は:
=
。 (「最長一致接頭辞」一致)正規表現パーツの順序を調整する必要があります。