Breakとlast(書き換えのフラグ)の違いがわかりません。ドキュメントはかなり厄介です。一部の構成で2つを切り替えようとしましたが、動作の違いを見つけることができませんでした。誰かがこれらのフラグをより詳細に説明できますか?あるフラグを別のフラグにフリップしたときの異なる動作を示す例が望ましい。
場所によって、書き換えルールのセットが異なる場合があります。書き換えモジュールがlast
に一致すると、現在のセットの処理が停止し、書き換えられたリクエストがもう一度渡されて、適切な場所(および新しい書き換えルールのセット)が検索されます。ルールがbreak
で終了する場合、書き換えも停止しますが、書き換えられたリクエストは別の場所に渡されません。
つまり、loc1とloc2の2つの場所があり、loc1にloc1をloc2に変更し、かつlast
で終わる書き換えルールがある場合、リクエストは書き換えられ、場所loc2に渡されます。ルールがbreak
で終わる場合、ロケーションloc1に属します。
OPは例を好んだ。また、@ minaevが書いたのは話の一部に過ぎませんでした!さあ、行きましょう...
server {
server_name example.com;
root 'path/to/somewhere';
location / {
echo 'finally matched location /';
}
location /notes {
echo 'finally matched location /notes';
}
location /documents {
echo 'finally matched location /documents';
}
rewrite ^/([^/]+.txt)$ /notes/$1;
rewrite ^/notes/([^/]+.txt)$ /documents/$1;
}
# curl example.com/test.txt
finally matched location /documents
rewrite
の場合、フラグはオプションです!
server {
server_name example.com;
root 'path/to/somewhere';
location / {
echo 'finally matched location /';
}
location /notes {
echo 'finally matched location /notes';
}
location /documents {
echo 'finally matched location /documents';
}
rewrite ^/([^/]+.txt)$ /notes/$1 break; # or last
rewrite ^/notes/([^/]+.txt)$ /documents/$1; # this is not parsed
}
# curl example.com/test.txt
finally matched location /notes
ロケーションブロックの外では、break
とlast
の両方が正確に動作します...
location
一致の検索)server {
server_name example.com;
root 'path/to/somewhere';
location / {
echo 'finally matched location /';
rewrite ^/([^/]+.txt)$ /notes/$1 break;
rewrite ^/notes/([^/]+.txt)$ /documents/$1; # this is not parsed
}
location /notes {
echo 'finally matched location /notes';
}
location /documents {
echo 'finally matched location /documents';
}
}
# curl example.com/test.txt
finally matched location /
ロケーションブロック内では、break
フラグは次のことを行います...
location
ブロックを解析し続けますserver {
server_name example.com;
root 'path/to/somewhere';
location / {
echo 'finally matched location /';
rewrite ^/([^/]+.txt)$ /notes/$1 last;
rewrite ^/notes/([^/]+.txt)$ /documents/$1; # this is not parsed
}
location /notes {
echo 'finally matched location /notes';
rewrite ^/notes/([^/]+.txt)$ /documents/$1; # this is not parsed, either!
}
location /documents {
echo 'finally matched location /documents';
}
}
# curl example.com/test.txt
finally matched location /notes
ロケーションブロック内では、last
フラグは次のことを行います...
rewrite
結果の結果に基づく別の場所の一致。rewrite
またはbreak
を持つlast
条件が一致すると、Nginxはそれ以上のrewrites
の解析を停止します。break
またはlast
を使用すると、Nginxは同じジョブを実行します(書き換え条件の処理を停止します)。break
を使用すると、Nginxはもう書き換え条件の処理のみを停止しますlast
を使用すると、Nginxはリライト条件の処理を停止し、次に検索を開始location
ブロックの新しい一致を求めます! Nginxは、新しいrewrites
ブロック内のlocation
も無視します!さらにいくつかのEdgeケース(500 internal error
などの書き換えに関する実際の一般的な問題)を含めることができませんでした。しかし、それはこの質問の範囲外です。おそらく、例1も対象外です!