Nginxの書き換えモジュールの詳細な説明

Nginxの書き換えモジュールの詳細な説明

書き換えモジュールは ngx_http_rewrite_module モジュールです。その主な機能はリクエスト URI を書き換えることです。これは Nginx にデフォルトでインストールされるモジュールです。書き換えモジュールは、PCRE 正規表現に従って URI を書き換え、内部リダイレクトを開始して場所を一致させるか、直接 30 回のリダイレクトを実行してクライアントに戻ります。

コマンド実行の順序は、まずサーバー ブロック内の書き換えモジュール コマンドを実行して、書き換え後のリクエスト URI を取得します。
次に、以下の命令をループで実行します。

ブレークループフラグに遭遇しない場合、このループは最大10回実行されますが、書き換え後にブレーク命令を使用して新しいループラウンドを中断することができます。
(1)書き換え後のリクエストURIに応じて定義されたロケーションブロックを一致させる

(2)一致した位置にある書き換えモジュール命令を順次実行する

命令
壊す
コンテキスト: サーバー、場所、if
ngx_http_rewrite_module の命令セットの実行を停止しますが、他のモジュール命令は影響を受けません。

サーバー{
 8080を聴く;
 # ここでbreakはサーバーブロックのreturn命令の実行を停止します(return命令は書き換えモジュールに属します)
 # コメントアウトすると、すべての受信リクエストがOKを返します
 壊す;
 200「ok」を返します。
 場所 = /testbreak {
  壊す;
  200 $request_uri を返します。
  プロキシパス http://127.0.0.1:8080/other;
 }
 位置 / {
  200 $request_uri を返します。
 }
}

# 次のようにリクエストを送信します# curl 127.0.0.1:8080/testbreak
# /他の

# `/testbreak` の代わりに `/other` が返されていることが分かります。これは、`proxy_pass` 命令がまだ実行されていることを示しています。 # つまり、他のモジュールの命令は break によって中断されません。 # (proxy_pass は ngx_http_proxy_module の命令です)

もし
コンテキスト: サーバー、場所

指定された条件に基づいてifブロック文の内容を実行するかどうかを決定します

ifにおけるいくつかの判断条件
1. 変数名。変数$variableの値が空の文字列または文字列「0」の場合、それは偽です。
2. 変数と文字列の比較は、等しい (=) と等しくない (!=) です。ここでは、等号を代入文として使用しないことに注意してください。
3. 変数と正規表現のパターンマッチング演算子は、(大文字と小文字を区別する正規マッチングの場合は~、大文字と小文字を区別しない正規マッチングの場合は~、最初の2つの否定である!! ) になります。
4. -f (存在する) と !-f (存在しない) を使用してファイルが存在するかどうかを確認します。
5. -d (存在する) と !-d (存在しない) を使用してパスが存在するかどうかを確認します。次の判定は文字列または変数になります。
6. -e (存在する) および !-e (存在しない) を使用して、ファイル、パス、またはリンクが存在するかどうかを確認します。次のチェックは、文字列または変数にすることができます。
7. ファイルが実行可能ファイルかどうかを確認するには、-x (実行可能) と !-x (実行不可能) を使用します。次の判定は文字列または変数になります。

なお、上記 1、2、3 の値は変数である必要がありますが、4、5、6、7 の値は変数でも文字列でもかまいません。-f/-d/-e/-x の基本的な使い方は bash と同じです。

$variable を "0" に設定します。 
($変数)の場合{
 # 「0」は偽なので実行されません
 壊す;   
}

# 正規表現に一致する変数を使用しても問題はありません if ( $http_host ~ "^star\.igrow\.cn$" ) {
 壊す;   
}

# 文字列が正規表現に一致し、エラーを報告します if ( "star" ~ "^star\.igrow\.cn$" ) {
 壊す;   
}
# ファイルのような文字列と変数の両方が正常かどうかを確認します if ( !-f "/data.log" ) {
 壊す;   
}

if ( !-f $ファイル名 ) {
 壊す;   
}

戻る

コンテキスト: サーバー、場所、if
戻りコード[テキスト];
戻りコード URL;
URLを返します。

処理を停止し、指定されたコードをクライアントに返します。 非標準コード 444 は、応答ヘッダーを送信せずに接続を閉じます。

バージョン 0.8.42 以降では、return ステートメントでリダイレクト URL を指定できます (ステータス コードは 301、302、303、307 のいずれかになります)。
他のステータス コードの応答のテキスト コンテンツを指定することもできます。また、リダイレクト URL と応答テキストには変数を含めることができます。

リダイレクトされた URL をこのサーバーのローカル URL として指定できる特別なケースがあります。この場合、nginx は要求されたプロトコル $scheme、server_name_in_redirect、port_in_redirect に基づいて完全な URL を自動的に生成します (ここで注意すべき点は、server_name_in_redirect と port_in_redirect の指示は、サーバー ブロック内の server_name と listen port をリダイレクトとして使用するかどうかを示すことです)

# 戻りコード [テキスト]; クライアントにOKを返す location = /ok {
 200「ok」を返します。
}

# リターンコード URL; Baidu への一時的なリダイレクト location = /redirect {
 302 http://www.baidu.com を返します。
}

# 戻りURL; 上と同様に、デフォルトも一時的なリダイレクトです location = /redirect {
 http://www.baidu.com を返します。
}

リライト

コンテキスト: サーバー、場所、if


正規表現の置換を書き換える [フラグ];

書き換えディレクティブは、指定された正規表現 regex を使用して要求された URI と一致させ、一致が成功した場合は、置換を使用して URI を変更します。書き換えディレクティブは、設定ファイル内に記述された順序で実行されます。このフラグは、命令のそれ以上の処理を終了するために使用できます。置換文字列が http://、https://、または $scheme で始まる場合、後続のコンテンツの処理を停止し、クライアントに直接リダイレクトします。

最初のケースでは、文字列をhttp://に書き換えます。

位置 / {
 # 正規表現 /test1/(.*) に一致すると、リクエストは一時的に http://www.$1.com にリダイレクトされます。
 # リダイレクトとして記述されたフラグと同等
 /test1/(.*) http://www.$1.com を書き換えます。
 200「ok」を返します。
}
# ブラウザに127.0.0.1:8080/test1/baiduと入力 
# 一時的に www.baidu.com にリダイレクトします
# 次のreturnコマンドは実行されません

2番目のケースでは、http://なしで文字列を書き換えます。

位置 / {
 /test1/(.*) www.$1.com を書き換えます。
 200「ok」を返します。
}
# 次のようにリクエストを送信します# curl 127.0.0.1:8080/test1/baidu
# わかりました

# ここには http:// がないので、単純に書き換えるだけです。要求されたURIは/test1/baiduからwww.baidu.comに書き換えられます
# 書き換えコマンドは順番に実行されるため、次のステップは戻りコマンドを実行することであり、応答は正常です

書き換えの4つのフラグ

1.最後
ngx_http_rewrite_module の現在の命令セットの処理を停止し、変更された URI に一致する場所の検索を開始します (last は「続行」を意味するため、引き続き一致を試み、他の場所にジャンプします)
2.休憩
上記の break 命令と同様に、現在の ngx_http_rewrite_module 命令セットの処理を停止します (break は「break stop」を意味します)。
3. リダイレクト
302 一時リダイレクトを返します。 (「一時貸し」と理解できます)
4.永久
301 永続リダイレクトを返します。 (「新しい家に引っ越す」という意味になります)

# 書き換えがなく、その後にフラグもない場合は、順番に実行されます。# 実行可能な場所に書き換えモジュール命令がない場合、場所と一致する場所の新しいラウンドを開始するように書き換えられます / {
 # フラグがない場合、デフォルトの順序は rewrite ^/test1 /test2 です。
 ^/test2 /test3 を書き換えます。# ここで、URI に一致する新しいラウンドの場所が開始されます。これは /test3 です。
}

場所 = /test2 {
 200 "/test2" を返します。
} 

場所 = /test3 {
 200 "/test3" を返します。
}
# 次のリクエストを送信します# curl 127.0.0.1:8080/test1
# /テスト3

ラストとブレイクの違い

last や break と同様に、この場所にある他の書き換えモジュール命令の実行を終了します。
しかし、last は直ちに新しいラウンドの位置マッチングを開始しますが、break は開始しません。


位置 / {
 ^/test1 /test2 を書き換えます。
 rewrite ^/test2 /test3 last; # ここで、URI に一致する新しいロケーション ラウンドが開始されます: /test3
 ^/test3 /test4 を書き換えます。
 proxy_pass http://www.baidu.com;
}

場所 = /test2 {
 200 "/test2" を返します。
} 

場所 = /test3 {
 200 "/test3" を返します。
}
場所 = /test4 {
 200 "/test4" を返します。
}
# 次のリクエストを送信します# curl 127.0.0.1:8080/test1
# /テスト3 

上記の場所/を次のコード場所/{に変更すると
 ^/test1 /test2 を書き換えます。
 # ここでは新しいロケーションマッチングは開始されません。後続の書き換えモジュール命令は終了し、書き換えられた URI は /more/index.html になります。
 ^/test2 /more/index.html を書き換えて、break; 
 rewrite /more/index\.html /test4; # このコマンドは無視されます # proxy_pass は rewrite モジュールのコマンドではないため、break proxy_pass https://www.baidu.com によって終了されません。
}
# 次のリクエストを送信します# ブラウザに 127.0.0.1:8080/test1 と入力します 
# エージェントから Baidu 製品ページへ https://www.baidu.com/more/index.html;

書き換え後のリクエスト パラメータ<br /> 置換文字列の置換に新しいリクエスト パラメータが含まれている場合、以前のリクエスト パラメータがその後に追加されます。以前のパラメータが必要ない場合は、置換文字列の最後に疑問符を付けて、追加されないようにします。

# 最後に ? が追加されているため、書き換え後の URL に元のリクエスト パラメータは追加されません。 rewrite ^/users/(.*)$ /show?user=$1? last;

ログを書き換える

コンテキスト: http、サーバー、場所、if

rewrite モジュール命令実行のログを有効または無効にします。有効にすると、rewrite は nginx error_log に通知レベルのログを記録します。デフォルトはオフです。

構文: rewrite_log on | off;

セット

コンテキスト: サーバー、場所、if

指定された変数の値を設定します。変数の値には、テキスト、変数、またはこれらの組み合わせを含めることができます。

位置 / {
 $var1 に "ホストは " を設定します。
 $var2 に $host を設定します。
 $var3 に「uri は $request_uri です」を設定します。
 200「応答 OK $var1$var2$var3」を返します。
}
# 次のリクエストを送信します# curl 127.0.0.1:8080/test
# 応答OK ホストは127.0.0.1 URIは/test

初期化されていない変数の警告

コンテキスト: http、サーバー、場所、if

初期化されていない変数に関する警告をログに記録するかどうかを制御します。デフォルトで有効

内部実装

ngx_http_rewrite_module モジュール ディレクティブは、構成フェーズ中に、リクエスト処理中に解釈される内部ディレクティブにコンパイルされます。インタプリタは単純な仮想スタック マシンです。

例えば、

location /download/ { if ( forbidden ) return 403 ; if ( forbidden) { return 403; } if ( forbidden)return403;if(slow) { limit_rate 10k; } rewrite ^/(download/. )/media/(. )…*$ /$1/mp3/$2.mp3 break; }

以下の手順に翻訳されます:

変数 $forbidden ゼロチェック 403 を返す コードの終わり 変数 $slow ゼロチェック 正規表現の一致 “/” をコピー $1 をコピー “/mp3/” をコピー $2 をコピー “.mp3” 正規表現の終わり コードの終わり

上記には limit_rate ディレクティブがないことに注意してください。これは ngx_http_rewrite_module モジュールとは関係ありません。 if ブロック用に別の構成を作成します。条件が真の場合、limit_rate が 10k に等しいリクエストがこの構成に割り当てられます。 \

命令

書き換え ^/(download/. )/media/(. )…*$ /$1/mp3/$2.mp3 break;

正規表現の最初のスラッシュを括弧内に置くと、次のように簡略化できます。

書き換え ^(/download/. )/media/(. )…*$ $1/mp3/$2.mp3 break;

対応するディレクティブは次のようになります。

正規表現の一致 $1 をコピー “/mp3/” をコピー $2 をコピー “.mp3” をコピー 正規表現の終了 コードの終了

場所(非書き換えモジュール)

文法

次のようにサーバー ブロックで使用します。

  • サーバ{
  • 場所表現 {
  • }

場所表現タイプ

パスを直接記述すると、大文字と小文字が区別される正規表現によってパスが照合されます。
~*は大文字と小文字を区別しない通常の一致を実行することを意味します
^~ は通常の文字マッチングを意味します。プレフィックスマッチングを使用します。一致が成功した場合、他の場所は一致しません。
= 一般的な文字の完全一致を実行します。つまり、完全一致です。

優先度
1. 等号タイプ (=) が最も優先されます。一致が見つかると、それ以上の一致は検索されません。
2.^~型式。一致が見つかると、それ以上の一致は検索されません。
3. 正規表現タイプ (~ ~*) は次に優先順位が高くなります。正規表現に一致する場所が複数ある場合は、最も長い正規表現を持つ場所が使用されます。
4. 従来の文字列マッチングタイプ。プレフィックスで一致します。

Nginx の rewrite モジュールの詳細説明はこれで終わりです。より関連性の高い Nginx rewrite コンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Nginx URL 書き換えメカニズムの原理と使用例
  • Nginx の書き換え正規マッチング書き換え方法の例
  • nginx のロケーションと書き換えの使用法の詳細な説明
  • nginx rewriteを使用してURLをリダイレクトする方法
  • URLパラメータに応じたnginxの書き換えと場所の詳細な説明
  • Nginx 書き換え 書き換えの基本と例の共有
  • Nginx Rewrite ルールと使用方法の紹介とスキルの例
  • nginx の書き換え擬似静的設定パラメータと使用例
  • nginx 書き換え関数の使用シナリオの分析

<<:  MySQL で複数のフィールドを連結する詳細な例

>>:  Vue フォーム入力バインディング v-model

推薦する

Vue組み込みコンポーネントのキープアライブの使用例

目次1. キープアライブの使用使用例: 1. すべてのページをキャッシュする: 2. 条件に基づいて...

Linux での crontab スケジュール実行コマンドの詳細な説明

LINUX では、定期的なタスクは通常、cron デーモン プロセス [ps -ef | grep ...

Mysql varchar型の合計操作例

友人の中には、データベースについて学習しているときに、テーブル構造を作成するときに誤ってフィールドを...

3つのDocker Nginxログの処理の詳細な説明

社内の同僚は Nginx ログの標準出力、つまりコンソール経由の処理を必要としているため、まずログを...

設定ファイルを書いてMyBatisを簡単に使う方法

設定ファイルを書いてMyBatisを簡単に使う方法マイバティス3.xここでは MyBatis につい...

docker-machineの使い方の詳しい説明

Docker-machineはDockerが公式に提供しているDocker管理ツールです。これは d...

DockerでSpring Bootアプリケーションを実行する方法

ここ数日、dockerでSpring Bootアプリケーションを実行する方法を勉強してきました。以前...

写真のプレビューとアップロード機能を実現するhtml+css+js

はじめに: Web ページを作成するときに、画像をアップロードする必要がある場合がよくあります。画像...

JavaScript デザインパターンの学習 アダプタパターン

目次概要コードの実装要約する概要アダプタ パターンは、デザイン パターンの動作パターンのパターンです...

nginxフォワードプロキシとリバースプロキシの詳細な説明

目次フォワードプロキシnginx リバースプロキシnginx リバースプロキシ 02リバースプロキシ...

Centos8.2 クラウド サーバー環境に Tomcat8.5 をインストールするための詳細なチュートリアル

Tomcatをインストールする前に、まずJDK環境をインストールしてくださいLinux サーバー上で...

フロントエンドセキュリティの詳細な説明: JavaScript の http ハイジャック対策と XSS

目次HTTP ハイジャック、DNS ハイジャック、XSS HTTPハイジャックDNSハイジャックXS...

XHTML チュートリアル: 初心者のための XHTML の基礎

<br />当サイトのオリジナルコンテンツですので、転載の際は出典を123WORDPRE...

Nginx リバース プロキシを使い始める

目次概要リバースプロキシの役割Nginx リバース プロキシ イントラネット侵入 8081 ポートの...

純粋なCSSでは、子要素が親要素の幅制限を突破できる。

文章のスタイルでは、このような状況がよく見られます コードは次のとおりです <div styl...