1. 場所の正規表現 例を見てみましょう: 場所 = / { # 完全一致 / 、ホスト名の後に文字列を続けることはできません [ 構成 A ] } 位置 / { # すべてのアドレスが / で始まるため、このルールはすべてのリクエストに一致します # ただし、正規表現と最長文字列が最初に一致します [ 構成 B ] } 場所 /documents/ { # /documents/ で始まるアドレスに一致します。一致後、検索を続けます。# これは、次の正規表現に一致しない場合にのみ使用されます [ 構成 C ] } 場所 ~ /documents/Abc { # /documents/Abc で始まる任意のアドレスに一致します。一致したら、以下の検索を続けます。# これは、次の正規表現に一致しない場合にのみ使用されます [ 構成 CC ] } 場所 ^~ /images/ { # /images/ で始まる任意のアドレスに一致します。一致が見つかったら、正規表現の検索を停止し、この正規表現を使用します。 [ 構成 D ] } 場所 ~* \.(gif|jpg|jpeg)$ { # gif、jpg、jpeg で終わるすべてのリクエストに一致します。# ただし、/images/ の下の画像に対するすべてのリクエストは、^~ がこの正規表現に到達できないため、構成 D によって処理されます [構成 E] } 場所 /images/ { # 文字は /images/ と一致します。さらに下を見ていくと、^~ が存在することがわかります [ 構成 F ] } 場所 /images/abc { # 最も長い文字は /images/abc と一致します。さらに下を見ていくと、^~ が存在することがわかります。# F と G の配置順序は無関係です [ 構成 G ] } 場所 ~ /images/abc/ { # 設定 D が削除された場合にのみ有効になります。まず設定 G で始まるアドレスを一致させて検索を続け、この正規表現が一致したら [設定 H] を使用します。 } 場所 ~* /js/.*/\.js 場所のプレフィックス 指定されたパターンで始まる場所に一致するプレフィックスはありません = 指定されたパターンで始まらない完全一致 ~ 正規表現マッチング、大文字と小文字を区別 ~* 正規表現マッチング、大文字と小文字を区別しない ^~ 非正規マッチング、指定されたパターンで始まる場所にマッチ 位置一致順序 複数の通常の場所は、記述された順序で直接一致します。一致が成功すると、それ以上の一致は行われません。 通常(非正規)の場所は、最高の一致(最大プレフィックス一致)が見つかるまで下に移動し続けます。 共通の場所と通常の場所の両方が存在する場合、通常の場所が正常に一致すると、共通の場所は再度一致しません。 すべての種類の場所が存在する場合、「=」マッチング > 「^~」マッチング > 通常のマッチング > 通常(最大プレフィックスマッチング) 注文: (location =) > (location フルパス) > (location ^~ パス) > (location ~,~* 通常のシーケンス) > (location 部分的な開始パス) > (/) 上記の一致する結果 上記の場所の記述によれば、次の一致例が確立されます。 完全一致、/index.html も一致しない /downloads/download.html -> 設定 B Bにマッチした後、下にマッチするものがないので、Bを使用する /images/1.gif -> 構成 D Fにマッチ、Dにマッチ、下がるのを止める /images/abc/def -> 設定D 最も長い一致は G で、D まで下がって一致し、そこで停止します。/images/ で始まるものはすべて D に一致して停止することがわかります。ここで FG と書いても意味がなく、H が順番に来ることはありません。これは一致順序を示すためだけのものです。 /documents/document.html -> 設定C C に一致、以下に一致なし、C を使用 /documents/1.jpg -> 構成 E Cに一致し、次にEに一致する /documents/Abc.jpg -> 設定CC 最も長い一致は C であり、通常のシーケンスは E ではなく CC と一致します。 実用的な使用提案 したがって、実際の使用では、次のように少なくとも 3 つの一致ルール定義があると思います。 #ウェブサイトのルートと直接一致します。ドメイン名を介してウェブサイトのホームページにアクセスする方が頻繁になります。これを使用すると、処理が高速化されると公式サイトは述べています。 #これはバックエンドアプリケーションサーバーに直接転送されるか、静的ホームページになる場合があります# 最初に必要なルールの場所 = / { proxy_pass http://tomcat:8080/index } # 2 番目の必須ルールは、静的ファイル要求を処理することです。これは、http サーバーとしての nginx の強みです。# ディレクトリ マッチングまたはサフィックス マッチングの 2 つの構成モードがあり、どちらかを選択するか、両方を使用します。location ^~ /static/ { ルート /webroot/static/; } 場所 ~* \.(gif|jpg|jpeg|png|css|js|ico)$ { ルート /webroot/res/; } #3 番目のルールは一般的なルールで、動的なリクエストをバックエンド アプリケーション サーバーに転送するために使用されます。#非静的ファイル リクエストはデフォルトで動的なリクエストであり、実際の状況に応じて把握できます。#結局のところ、人気のあるフレームワークの中には、.php や .jsp のサフィックスが付いているものはほとんどありません。location / { プロキシパス http://tomcat:8080/ } 2. ルールの書き換え 書き換え機能は、nginx が提供するグローバル変数または自分で設定した変数を正規表現とフラグと組み合わせて使用し、URL の書き換えとリダイレクトを実現します。 rewrite は server{}、location{}、if{} にのみ配置でき、渡されたパラメータを除くドメイン名の後の文字列に対してのみ機能します。 たとえば、http://jb51.net/a/we/index.php?id=1&u=str は /a/we/index.php のみを書き換えます。 構文書き換え 相対ドメイン名またはパラメータ文字列が機能する場合は、グローバル変数マッチングを使用するか、proxy_pass リバース プロキシを使用できます。 これは、rewrite 関数と location 関数が多少似ており、どちらもジャンプを実現できることを示しています。主な違いは、rewrite は同じドメイン名内のリソースを取得するためにパスを変更するのに対し、location はパスのクラスへのアクセスを制御したり、リバース プロキシを実行して他のマシンに proxy_pass できることです。 多くの場合、rewrite も location に書き込まれます。実行順序は次のとおりです。 サーバーブロックの書き換えディレクティブを実行する 位置マッチングを実行する 選択した場所で書き換えディレクティブを実行します いずれかのステップで URI が書き換えられた場合、実際のファイルが見つかるまでステップ 1 ~ 3 がループで再度実行されます。ループが 10 回を超えると、500 内部サーバー エラーが返されます。 2.1 旗
301 と 302 は単純にステータス コードだけを返すことはできないため、リダイレクト URL も必要です。これが、戻り命令が 301、302 を返すことができない理由です。ここでの last と break の違いは少しわかりにくいです: last は通常 server と if で記述され、break は通常 location で使用されます。 2.2 if命令とグローバル変数 判断指示の場合 構文は 式が単なる変数である場合、値が空または 0 で始まる文字列であれば、false と見なされます。 変数と内容を直接比較する場合は、
例えば: $http_user_agent の場合: 書き換え^(.*)$ /msie/$1 break; } //UA に "MSIE" が含まれている場合は、リクエストを /msid/ ディレクトリに書き換えます if ($http_cookie ~* "id=([^;]+)(?:;|$)") { $id を $1 に設定します。 } //クッキーが正規表現に一致する場合、変数$idを正規表現の参照部分と同じ値に設定します。if ($request_method = POST) { 405 を返します。 } // 送信方法が POST の場合、戻りステータスは 405 (メソッドが許可されていません) になります。戻る 戻ることができない 301,302 もし($遅い){ 制限レート 10k; } //速度制限$slowはsetコマンドで設定できます if (!-f $request_filename){ 壊す; プロキシパス http://127.0.0.1; } // 要求されたファイル名が存在しない場合は、localhost にリバース プロキシします。ここでのbreakは書き換えチェックも停止します。if ($args ~ post=140){ ^ http://example.com/ を永久に書き換えます。 } //クエリ文字列に「post=140」が含まれている場合は、example.com に永続的にリダイレクトします 場所 ~* \.(gif|jpg|png|swf|flv)$ { valid_referers なしブロック www.jefflei.com www.leizhenfang.com; ($invalid_referer) の場合 { 404 を返します。 } // ホットリンク防止} グローバル変数 以下は、判断と同様に使用できるグローバル変数です。
2.3 一般的な正規表現
2.4 書き換え例 例1: http { # 画像ログ形式を定義します log_format imagelog '[$time_local] ' $image_file ' ' $image_type ' ' $body_bytes_sent ' ' $status; # 書き換えログを有効にする rewrite_log on; サーバー{ ルート /home/www; 位置 / { # 書き換えルール情報 error_log logs/rewrite.log notice; # {}を避けるためにここでは一重引用符を使用する必要があることに注意してください '^/images/([az]{2})/([a-z0-9]{5})/(.*)\.(png|jpg|gif)$' /data?file=$3.$4 を書き換えます。 # 上記のルールの後に「last」パラメータを追加できないことに注意してください。そうしないと、次の set コマンドが実行されません。set $image_file $3; $image_type を $4 に設定します。 } 場所 / データ { # イメージの種類とサイズを分析するためのイメージのログ形式を指定します access_log logs/images.log mian; ルート /data/images; # 以前に定義した変数を適用します。まずファイルが存在するかどうかを判断し、存在しない場合はディレクトリが存在するかどうかを判断し、存在しない場合は最後の URL にジャンプします try_files /$arg_file /image404.html; } 場所 = /image404.html { # 画像が存在しない場合は、特定の情報を返します return 404 "image not found\n"; } } /images/ef/uh7b3/test.png のようなリクエストの場合、/data?file=test.png に書き換えられ、/data の場所と一致します。まず、/data/images/test.png ファイルが存在するかどうかを確認します。存在する場合は、通常どおり応答します。存在しない場合は、tryfiles を新しい image404 の場所に書き換え、404 ステータス コードを直接返します。 例2: ^/images/(.*)_(\d+)x(\d+)\.(png|jpg|gif)$ /resizer/$1.$4?width=$2&height=$3? を書き換えます。 /images/bla_500x400.jpg などのファイル要求は、アドレス /resizer/bla.jpg?width=500&height=400 に書き換えられ、引き続き場所の一致が試行されます。 以上がnginxの設定場所の正規化と書き換えルールの書き方についての概要です。以下の関連記事にnginxの設定導入に関する記事がさらにあります。お役に立てれば幸いです。 以下もご興味があるかもしれません:
|
<<: MySQLデータベースでゼロ値を含む日付の問題について簡単に説明します
>>: Innodb システムテーブルスペースのメンテナンス方法
目次1. ルール 1: Object.Method() 1.1 ケース1 1.2 ケース2 1.3 ...
目次外部キーテーブルの関係を決定する方法テーブル関係を作成する方法1対多の関係 - 従業員テーブルと...
jdk をインストールします: Oracle 公式ダウンロード https://www.oracl...
任意のウェブページを開きます。例: http://www.baidu.com/ ブラウザのタブのヘッ...
目次1. 仮想マシンをダウンロードする2. 仮想マシンのインストールVMware のダウンロードとイ...
正直に言うと、この質問には MySQL のコア知識がかなり必要で、コンピュータ ネットワークの知識を...
この記事を読む前に、ボリューム、バインドマウント、tmpfs マウントの基本を理解しておいてください...
webpack-dev-server コアコンセプトWebpack の ContentBase と ...
データベースを構築してプログラムを書くとき、日付と時刻の使用は避けられません。データベースには、ti...
目次序文1. オフィス文書の種類のプレビュー2. PDF形式のプレビュー3. 画像の種類4. ビデオ...
現在、インターネット上でウェブサイトをコピーすることは非常に一般的です。では、他人が私たちのウェブサ...
プロジェクトをリリースするときに、キャッシュをクリーンアップする必要があるという問題に遭遇することが...
Web ページを作成するときに、クールでスムーズなドロップダウン メニューが必要になることがあります...
公式サイトの説明: コンポーネントを定義する場合、コンポーネントは複数のインスタンスを作成するために...
JSON 文字列を JSON オブジェクトに変換するにはどうすればいいですか? JSON.parse...