nginx url rewriting:breakとlastの違い


45

breakとlast(rewriteのフラグ)の違いがわかりません。ドキュメントはかなり難解です。いくつかの設定で2つを切り替えようとしましたが、動作の違いを見つけることができませんでした。誰かがこれらのフラグを詳細に説明してもらえますか?あるフラグを別のフラグに切り替えるときに異なる動作を示す例が望ましい。


答えはわかりませんが、答えが得られたらwiki.nginx.orgを更新してください。また、英語版のnginxメーリングリストは非常に活発であり、Igor(メインの開発者)は月に何百もの質問に答えているので、おそらくそこに尋ねてください。
rmalayter

@rmalayter-この質問はnginxメーリングリストで尋ねられました。イゴールはそれに答えたが答えはどちらか私にはあまり意味がありませんでした:pubbs.net/nginx/200908/46047

ドメインが引き継がれたため、pubbs.netリンクが壊れています。申し訳ありませんが、それが指すべき場所を見つけることができませんでした。;(
Tino

回答:


40

場所ごとに異なる書き換えルールセットがある場合があります。書き換えモジュールが満たされるとlast、現在のセットの処理が停止し、書き換えられた要求が再度渡されて適切な場所(および書き換えルールの新しいセット)が検索されます。ルールがで終わる場合、break書き換えも停止しますが、書き換えられたリクエストは別の場所に渡されません。

つまり、loc1とloc2の2つの場所があり、loc1をloc2に変更しlast、で終わる書き換えルールがある場合、要求は書き換えられ、場所loc2に渡されます。ルールがで終わる場合、break場所loc1に属します。


リライトにbreakフラグがある場合、一致するロケーションブロックを検索しないため、ロケーションloc1に属します。
マーティンフィヨルドヴァルド

まさに。一定。
-minaev

43

OPは例を優先しました。また、@ minaevが書いたことは、物語の一部にすぎませんでした!だから、ここに行く...

例1:フラグなし(中断または最後)

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、フラグはオプションです!

例2:外部ロケーションブロック(ブレークまたは最後)

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

説明:

場所のブロック、両方の外側breaklast正確な方法で振る舞います...

  • 書き換え条件の解析はこれ以上ありません
  • Nginx内部エンジンは次のフェーズに進みます(location一致の検索)

例3:ロケーションブロックの内部-「ブレーク」

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 /

説明:

ロケーションブロック内で、breakflagは次のことを行います...

  • 書き換え条件の解析はこれ以上ありません
  • Nginx内部エンジンは現在のlocationブロックを解析し続けます

例4:内部ロケーションブロック-「最後」

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

説明:

ロケーションブロック内で、lastflagは次のことを行います...

  • 書き換え条件の解析はこれ以上ありません
  • Nginx内部エンジン、結果の結果に基づいて別の場所の一致を探し始めますrewrite
  • 次の場所が一致した場合でも、書き換え条件の解析は不要です!

概要:

  • ときにrewriteフラグを条件breaklastマッチは、nginxのは、それ以上の解析を停止しますrewrites
  • ロケーションブロックの外側で、breakまたはを使用してlast、Nginxは同じジョブを実行します(書き換え条件の処理を停止します)。
  • ロケーションブロック内でbreak、Nginxは書き換え条件の処理のみを停止します
  • ロケーションブロック内でlast、Nginxは書き換え条件の処理を停止し、ブロックの新しい一致を探し始めlocationます!Nginx rewritesは新しいlocationブロック内のすべても無視します!

最終ノート:

いくつかのエッジケース(実際には、書き換えなどの一般的な問題)を含めることができません500 internal errorでした。しかし、それはこの質問の範囲外です。おそらく、例1も範囲外です!


ERROR:「制御プロセスがエラーコードで終了したので、nginx.serviceに失敗しました」...未知のディレクティブ「エコー」
ピーター・クラウス

nginx.com/resources/wiki/modules/echo。Ubuntu 14.04などの一部のLinuxディストリビューションでは、特定のパッケージ(nginx-extrasなど)にこのモジュールがバンドルされています。それがお役に立てば幸いです。
ポティカリムトゥ

1
例1では、書き換えルールが3つの場所ディレクティブすべての上に配置されている場合、違いが生じますか
クレイグヒックス

1
@CraigHicksいいえ、そうではありません。書き換えルールは優先順位が高く、場所が一致する前に最初に実行されます。
ポティカリムトゥ

1
これが最良の答えです。これらの例を参照し、nginxのドキュメントを読んで理解するのは簡単です。
ドンディランガ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.