nginx 設定の場所の概要の場所の通常の書き込みと書き換えルールの書き込み

nginx 設定の場所の概要の場所の通常の書き込みと書き換えルールの書き込み

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 部分的な開始パス) > (/)

上記の一致する結果

上記の場所の記述によれば、次の一致例が確立されます。

/ -> config A

完全一致、/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 のみを書き換えます。

構文書き換えrewrite regex replacement [flag];

相対ドメイン名またはパラメータ文字列が機能する場合は、グローバル変数マッチングを使用するか、proxy_pass リバース プロキシを使用できます。

これは、rewrite 関数と location 関数が多少似ており、どちらもジャンプを実現できることを示しています。主な違いは、rewrite は同じドメイン名内のリソースを取得するためにパスを変更するのに対し、location はパスのクラスへのアクセスを制御したり、リバース プロキシを実行して他のマシンに proxy_pass できることです。

多くの場合、rewrite も location に書き込まれます。実行順序は次のとおりです。

サーバーブロックの書き換えディレクティブを実行する

位置マッチングを実行する

選択した場所で書き換えディレクティブを実行します

いずれかのステップで URI が書き換えられた場合、実際のファイルが見つかるまでステップ 1 ~ 3 がループで再度実行されます。ループが 10 回を超えると、500 内部サーバー エラーが返されます。

2.1 旗

last : Apacheの[L]フラグに相当し、書き換えが完了したことを示します。
break: 現在の仮想ホストの後続の書き換え命令セットの実行を停止します
リダイレクト: 302一時リダイレクトを返し、アドレスバーにリダイレクトされたアドレスが表示されます。
permanent: 301永続リダイレクトを返し、アドレスバーにリダイレクトされたアドレスが表示されます。

301 と 302 は単純にステータス コードだけを返すことはできないため、リダイレクト URL も必要です。これが、戻り命令が 301、302 を返すことができない理由です。ここでの last と break の違いは少しわかりにくいです:

last は通常 server と if で記述され、break は通常 location で使用されます。
lastは書き換えられたURLのマッチングを終了しません。つまり、新しいURLはサーバーからのマッチングプロセスを再度通過しますが、breakは書き換えられたマッチングを終了します。
break と last はどちらも、後続の書き換え命令の実行を防ぐことができます。

2.2 if命令とグローバル変数

判断指示の場合

構文はif(condition){...}で、指定された条件を判断します。 true の場合、中括弧内の書き換えディレクティブが実行されます。if 条件は次のいずれかになります。

式が単なる変数である場合、値が空または 0 で始まる文字列であれば、false と見なされます。

変数と内容を直接比較する場合は、 =または!=
使用します。 !=

~正規表現マッチング、 ~*大文字と小文字を区別しないマッチング、 !~大文字と小文字を区別しないマッチング

-f!-fファイルが存在するかどうかを判断するために使用されます

-d!-dディレクトリが存在するかどうかを判断するために使用されます

-e!-eファイルまたはディレクトリが存在するかどうかを判断するために使用されます

-x!-xファイルが実行可能かどうかを判断するために使用されます

例えば:

$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 を返します。
  } // ホットリンク防止}

グローバル変数

以下は、判断と同様に使用できるグローバル変数です。

$args: #この変数はリクエスト行のパラメータと等しく、$query_stringと同じです
$content_length: リクエスト ヘッダーの Content-length フィールド。
$content_type: リクエスト ヘッダーの Content-Type フィールド。
$document_root : 現在のリクエストのルートディレクティブで指定された値。
$host : リクエストのホスト ヘッダー フィールド、それ以外の場合はサーバー名。
$http_user_agent: クライアントエージェント情報
$http_cookie: クライアントのクッキー情報
$limit_rate : この変数は接続速度を制限できます。
$request_method: クライアントが要求したアクション。通常は GET または POST です。
$remote_addr : クライアントの IP アドレス。
$remote_port : クライアントのポート。
$remote_user : Auth Basic モジュールによって認証されたユーザー名。
$request_filename: ルートまたはエイリアス ディレクティブと URI リクエストによって生成された現在のリクエストのファイル パス。
$scheme : HTTP メソッド (例: http、https)。
$server_protocol : リクエストで使用されるプロトコル。通常は HTTP/1.0 または HTTP/1.1 です。
$server_addr: サーバー アドレス。この値は、システム コールの完了後に決定できます。
$server_name : サーバー名。
$server_port : リクエストがサーバーに到着するポート番号。
$request_uri : ホスト名を除いた、リクエストパラメータを含む元の URI (例: "/foo/bar.php?arg=baz")。
$uri : リクエストパラメータのない現在の URI。$uri には、「/foo/bar.html」などのホスト名は含まれません。
$document_uri : $uri と同じです。
例: http://localhost:88/test1/test2/test.php
$ホスト:ローカルホスト
$サーバーポート:88
$request_uri:http://localhost:88/test1/test2/test.php
$document_uri:/test1/test2/test.php
$ドキュメントルート:/var/www/html
$リクエストファイル名:/var/www/html/test1/test2/test.php

2.3 一般的な正規表現

. : 改行以外の任意の文字に一致します
? : 0回または1回繰り返す
+ : 1回以上繰り返す
* : 0回以上繰り返す
\d : 数字に一致
^ : 文字列の先頭に一致します
$: 文字列のマッチングの紹介
{n} : n回繰り返す
{n,}:n回以上繰り返す
[c] : 1文字のcにマッチ
[az]: 任意の小文字のazに一致します

括弧 () の間に一致する内容は後で $1 によって参照でき、$2 は 2 番目の () の内容を表します。正規表現で混乱を招くのは、\ エスケープ特殊文字です。

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の設定導入に関する記事がさらにあります。お役に立てれば幸いです。

以下もご興味があるかもしれません:
  • nginx のロケーションと書き換えの使用法の詳細な説明
  • URLパラメータに応じたnginxの書き換えと場所の詳細な説明
  • nginx の設定場所の概要と書き換えルールの記述の詳細な説明
  • Nginx におけるロケーション マッチングとリライト リダイレクトの詳細な説明

<<:  MySQLデータベースでゼロ値を含む日付の問題について簡単に説明します

>>:  Innodb システムテーブルスペースのメンテナンス方法

推薦する

JavaScript 関数のコンテキストのルールは何ですか?

目次1. ルール 1: Object.Method() 1.1 ケース1 1.2 ケース2 1.3 ...

MySQL 外部キー制約とテーブル関係の概要

目次外部キーテーブルの関係を決定する方法テーブル関係を作成する方法1対多の関係 - 従業員テーブルと...

tomcat をインストールし、Linux で Web サイトを展開します (推奨)

jdk をインストールします: Oracle 公式ダウンロード https://www.oracl...

favicon.ico についていくつか注意点があります (ルートディレクトリに置くのがベストです)

任意のウェブページを開きます。例: http://www.baidu.com/ ブラウザのタブのヘッ...

最新の超詳細な VMware 仮想マシンのダウンロードとインストールのグラフィック チュートリアル

目次1. 仮想マシンをダウンロードする2. 仮想マシンのインストールVMware のダウンロードとイ...

Tencent インタビュー: SQL ステートメントの実行が非常に遅くなる理由は何ですか? ---後悔シリーズは見ないで(推奨)

正直に言うと、この質問には MySQL のコア知識がかなり必要で、コンピュータ ネットワークの知識を...

Dockerデータストレージの概要

この記事を読む前に、ボリューム、バインドマウント、tmpfs マウントの基本を理解しておいてください...

webpack-dev-server のコア概念とケースの詳細な説明

webpack-dev-server コアコンセプトWebpack の ContentBase と ...

時刻を保存するために適切な MySQL の datetime 型を選択する方法

データベースを構築してプログラムを書くとき、日付と時刻の使用は避けられません。データベースには、ti...

vue3 のさまざまなファイルタイプのプレビュー機能の例

目次序文1. オフィス文書の種類のプレビュー2. PDF形式のプレビュー3. 画像の種類4. ビデオ...

他の人が私のウェブページを保存したり、サイトをコピーしたりするのを防ぐためのヒント

現在、インターネット上でウェブサイトをコピーすることは非常に一般的です。では、他人が私たちのウェブサ...

Vue プロジェクトでブラウザ キャッシュ設定を無効にする例

プロジェクトをリリースするときに、キャッシュをクリーンアップする必要があるという問題に遭遇することが...

jQueryはドロップダウンメニューのスライド効果を実現します

Web ページを作成するときに、クールでスムーズなドロップダウン メニューが必要になることがあります...

vue data が関数である理由をご存知ですか?

公式サイトの説明: コンポーネントを定義する場合、コンポーネントは複数のインスタンスを作成するために...

Nodejs は JSON 文字列を JSON オブジェクトに変換するエラー解決法

JSON 文字列を JSON オブジェクトに変換するにはどうすればいいですか? JSON.parse...