nginx locationルール優先度
ninxサーバは、Serverブロックの複数のlocationブロックの中で標準uriと要求文字列のマッチングがあるかどうかを検索し、複数のマッチングが可能であれば、最も整合度が高いものを記録する。その後、サーバは、ロカモーションブロック内の正則uriと要求文字列とをマッチングさせ、最初の正則uriがマッチングに成功したときに検索を終了し、このリクエストをこのlocationブロックを使用して処理する。正則一致がすべて失敗した場合、この要求は、先ほど記録された最も整合度の高いロカモーションブロックを使用して処理される。location優先度 inxの構成は以下の通りです。
server {
listen 80;
server_name www.nginxtest.me s.nginxtest.me a.nginxtest.me;
root /data/wwwroot/web/nginxtest.me/;
#access_log /data/wwwroot/log/www.nginxtest.me-access.log main_zdy;
access_log on;
error_log /data/wwwroot/log/www.nginxtest.me-error.log;
location / {
return 500;
}
location /testa/bb {
return 501;
}
location /testb {
return 404;
}
location /testb/bb {
return 405;
}
location ~ ^/testa {
return 503;
}
location = /testa {
return 502;
}
location ~ ^/testa/bb {
return 504;
}
location ^~ /testa/bb/cc {
return 403;
}
location ^~ /testa/bb/cc/gg {
return 402;
}
}
1)「=」の優先度が一番高く、マッチングが成功すると他のマッチを停止します。 だから入力しますhttp://www.nginxtest.me/testa は502を返しますが、http://www.nginxtest.me/testa/ などは一致しません。 2)マッチがない場合、またはマッチがマッチしていない場合は正規マッチを使用します。 正則マッチは上から下に一度マッチしたら下には実行されません。だから上に書いた正則は正確なほどいいです。http://www.nginxtest.me/testa/bb 504ではなく503を返します。 3)正則マッチがマッチしていない場合は、空マッチで検索します。空マッチの順序は正則と一致していません。上から下までではなく、精度でマッチしますので、入力します。http://www.nginxtest.me/testb/bb は405. 4)特殊です もし^~ 接続されているのは標準的なurlである(必ず標準uriであれば)、一致した場合は正規のマッチングは行われない(優先度が正の場合より高い)。http://www.nginxtest.me/testa/bb/cc http://www.nginxtest.me/testa/bb/cc/dd は、403を返します。 このようなマッチングも精度によってマッチします。http://www.nginxtest.me/testa/bb/cc/gg 402に戻ります 以上のように、もし私たちがlocationをたくさん書いたserverに、より正確なlocationを追加するには、3つの方法があります。 1このlocationのuriが確定すれば、標準uriを使って=号でマッチングできます。 2このlocationのuriが後ろの部分だけ確定していない場合は^^を使ってマッチングできます。例えば:location^~/testa/bb/cc このように入力していますhttp://www.nginxtest.me/testa/bb/cc/dd またはhttp://www.nginxtest.me/testa/bb/cc?sdfdjf すべてマッチします。 3このuriは前と後ろの中間が確定していない場合、正則uriと書く必要があります。しかし、正則uriは他の整合可能なlocation~正則uriの前にいなければなりません。そうでなければ無効です。