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 システムテーブルスペースのメンテナンス方法

推薦する

Vue は Tencent TIM インスタント メッセージングを統合します

この記事では主に、Tencent TIM インスタント メッセージングを Vue と統合する方法を紹...

Windows での MySQL 8.X インストール チュートリアル

以前は MySQL 5.7 を使用していましたが、MySQL にいくつか新しい機能が追加されたため、...

MySQL トランザクション制御フローと ACID 特性

目次1. ACIDの特性トランザクション制御構文3. トランザクション同時実行例外1. ダーティリー...

HTMLの最適化によりWebページの速度が向上

明らかな HTML、隠された「公開スクリプト」 Web ページのダウンロード時間を短縮する鍵は、フ...

リンクされた画像をダウンロードしてアップロードするJavaScriptの実装

写真をアップロードするので、まずはダウンロード可能な画像リソースかどうかを判断する必要があります。正...

ウェブデザインを改善するための 8 つの CSS ツールを共有する

ウェブサイトのデザインを編集または変更する必要がある場合、CSS が重要な役割を果たします。 CSS...

dockerを使用してdubboプロジェクトをデプロイする方法

1. まず、Springbootを使用して簡単なDubboテストプログラムを構築し、関連する依存関係...

HTML 文法百科事典_HTML 言語文法百科事典 (必読)

ボリュームラベル、プロパティ名、説明002 <! - - ... - -> コメント00...

JavaScript に関する 6 つの奇妙で便利な点

目次1. 解体のヒント2. デジタルセパレーター3. try...catch...finally が...

MySQL で datetime 型のデフォルト値を設定する方法

Navicat クライアントを通じてデフォルトの日時値を変更する際に問題が発生しました。データベース...

docker runの--rmオプションの使用方法

Docker コンテナが終了しても、デバッグを容易にし、ユーザー データを保持するために、デフォルト...

ウェブページをデザインする際に注意すべきいくつかの問題

Web デザインは、個人の好みや Web ページの内容に応じて、デザインのレイアウトが常に変化します...

Nginx がサーバーの生存状態をパッシブにチェックする詳細な説明

導入定期的にヘルスチェックを送信して、アップストリーム グループ内の HTTP サーバーのヘルスを監...

jsを使用して簡単なスネークゲームを書く

この記事では、参考までに、jsで書かれたシンプルなスネークゲームの具体的なコードを紹介します。具体的...

複数クリックを防ぐVueの実践

通常、クリック イベントは、メッセージ リマインダーのさまざまな状況に分割されます。これらが処理され...