nginx のロケーションと書き換えの使用法の詳細な説明

nginx のロケーションと書き換えの使用法の詳細な説明

1. 位置情報の利用状況の概要

ロケーションは、さまざまな処理方法に対してさまざまな種類のリクエストを見つけることができます。

1. 位置情報の利用

場所 ~* /js/.*/\.js

  • = で始まる場合は完全一致を示します。たとえば、ルート ディレクトリで終わるリクエストのみが一致し、その後に文字列を続けることはできません。
  • ^~で始まるということは、URIが通常の一致ではなく通常の文字列で始まることを意味します。
  • ~ で始まる場合は、大文字と小文字を区別した正規の一致を示します。
  • ~*で始まる場合、大文字と小文字を区別しない正規表現の一致を示します。
  • /で始まり、ユニバーサルマッチ、他にマッチするものがない場合は、どのリクエストもマッチします

位置の一致順序は、「最初に正規表現に一致し、次に共通表現に一致」です。

訂正: 場所の一致順序は実際には「最初に共通に一致し、次に正規に一致」です。私がこう言うと、誰もが間違いなく反論するでしょう。なぜなら、「まず共通を合わせ、次に正規を合わせる」という原則は、誰もが慣れている「まず正規を合わせ、次に共通を合わせる」という実際の経験を説明できないからです。ここで一時的に説明できるのは、この誤解の原因は、通常のマッチングが通常のマッチングを上書きすることだということです。

2. 位置情報の使用例

場所の正規表現:

1. # 完全一致 /、ホスト名の後に文字列を続けることはできません

場所 = / {
[ 構成A ]
} 

2.# すべてのアドレスは/で始まるので、このルールは最終的にデフォルトのリクエストと一致します

# ただし、正規表現と最長文字列は場所に一致します / {
[ 構成 B ]
}

例:

  位置 / { 
     proxy_pass http://server_pools;
    } 
#このルールは、他のルールが要件を満たさない場合にのみ一致します。これは、一致度が最も低い最後のルールになります。上記で実装された関数は次のとおりです。たとえば、Web サイトが www.blog.com の場合、その後に何も入力しないと、
他のルールが一致しない場合、リクエストは最終的にロード バランシング プール内のサーバーに渡されます。

3.# /documents/で始まるアドレスにマッチします。マッチしたら検索を続けます

# これは、次の正規表現が場所 /documents/ に一致しない場合にのみ使用されます {
[ 構成 C ]
}

例:

場所 /static/
    {
    書き直し ^ http://www.abc.com ;   
    }
#上記で実装された関数: ウェブサイトのドメイン名が www.blog.com であると仮定すると、上記の関数は、static の後にどのページがあっても (ページが存在しない可能性があります)、www.blog.com/static/ を入力するように構成されます。
その後、最終的にはウェブサイト www.abc.com にジャンプします。

4.# /documents/で始まるアドレスにマッチします。マッチしたら検索を続けます

# このルールは、次の正規表現に一致しない場合にのみ使用されます

場所 ~ /documents/Abc {
[ 構成 CC ]
}

5.# /images/ で始まる任意のアドレスに一致します。一致が見つかったら、正規表現の検索を停止し、この正規表現を使用します。

場所 ^~ /images/ {
[ 構成 D ]
}

6.# gif、jpg、jpegで終わるすべてのリクエストに一致します

# ただし、/images/ の下の画像に対するすべてのリクエストは、^~ がこの正規表現に到達できないため、構成 D によって処理されます。

場所 ~* \.(gif|jpg|jpeg)$ {
[ 構成 E ]
}

例:

7. # 文字は /images/ と一致します。下へ進むと、^~ が存在することがわかります。

場所 /images/ {
[ 構成 F ]
}

8.# 最も長い文字は /images/abc と一致します。下に進むと ^~ が存在することがわかります。

# FとGの配置順序は重要ではありません

場所 /images/abc {
[ 構成 G ]
}

9.# 設定Dが削除された場合にのみ有効になります。まず、設定Gで始まるアドレスを最も長く一致させ、下方向に検索を続け、この正規表現に一致させます。

場所 ~ /images/abc/ {
[ 構成 H ]
}

優先順位なしの注文:

(location =) > (location フルパス) > (location ^~ パス) > (location ~,~* 通常のシーケンス) > (location 部分的な開始パス) > (/) 上記の一致結果:

上記の場所の記述によれば、次の一致例が確立されます。
/ -> 設定A
完全一致、/index.html でも /downloads/download.html とは一致しない -> 構成 B
Bにマッチした後、下にマッチするものがないので、Bを使用する
/images/1.gif -> 構成 D
F に一致し、D に一致し、/images/abc/def -> config D で停止します
最も長い一致は G で、その後 D まで進み、そこで止まります。/images/ で始まるものはすべて D に一致して停止することがわかります。FG はここでは意味がなく、H は順番が回ってきません。これは、一致順序 /documents/document.html -> config C を示すためだけのものです。
C に一致、以下に一致なし、C を使用
/documents/1.jpg -> 構成 E
Cに一致し、次にEに一致する
/documents/Abc.jpg -> 設定CC
最も長い一致は C であり、通常のシーケンスは E ではなく CC と一致します。

3. 実践的な使用方法の提案

したがって、実際の使用では、次のように少なくとも 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/
}
http://tengine.taobao.org/book/chapter_02.html
nginx.org/en/docs/http/ngx_http_rewrite_module.html を参照してください。

2. Rewriteの使用法の概要

1. 書き換えの定義

書き換え機能は、nginx によって提供されるグローバル変数または自分で設定した変数を正規表現とフラグと組み合わせて使用​​し、URL の書き換えとリダイレクトを実現します。

 rewrite は server{}、location{}、if{} 内にのみ配置でき、渡されたパラメータを除くドメイン名の後の文字列に対してのみ機能します。
たとえば、http://seanlook.com/a/we/index.php?id=1&u=str は /a/we/index.php のみを書き換えます。

2. rewirteの構文

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

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

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

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

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

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

3 選択した場所で書き換え命令を実行する

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

フラグ

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

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

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

3.よく使われる正規表現を書き換えます。

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

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

書き換え例

例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 に書き換えられ、引き続き場所の一致が試行されます。

if命令とグローバル変数

if判断命令構文

if (条件)
{...}

与えられた条件を判断します。 true の場合、中括弧内の書き換えディレクティブが実行されます。if 条件は次のいずれかになります。

式が単なる変数である場合、値が空または 0 で始まる文字列であれば、false と見なされます。
変数と内容を直接比較する場合は、=または!=を使用します。
~ 正規表現マッチング
~* 大文字と小文字を区別しないマッチング
!~ 大文字と小文字が一致しません
-f と !-f はファイルが存在するかどうかを判断するために使用されます
-dと!-dはディレクトリが存在するかどうかを判断するために使用されます
-e と !-e はファイルまたはディレクトリが存在するかどうかを判断するために使用されます
-xと!-xはファイルが実行可能かどうかを判断するために使用されます

例:

ユーザーのデバイスがIEブラウザの場合、リダイレクト if ($http_user_agent ~ MSIE) {
書き換え^(.*)$ /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.comwww.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 と同じです。

例:

ローカルホスト: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

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

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

<<:  Node.js でのブレークポイント再開の実装

>>:  「いいね!」文がインデックスに登録されないのはなぜですか?

推薦する

Vue は better-scroll を使用して水平スクロール方法の例を実現します

1. スクロールの実装原理better-scroll のスクロール原理は、ブラウザのネイティブスクロ...

Reactのヒントはフックの依存関係の問題を解消する方法を教えます

reactプロジェクトで非常に一般的なシナリオ: const [watchValue、setWatc...

MySQL での mysqladmin 日常管理コマンドの概要 (必読)

mysqladmin ツールの使用形式は次のとおりです。 mysqladmin [オプション] コ...

MySQL での SQL モードの表示と設定の詳細な説明

MySQL での SQL モードの表示と設定MySQL はさまざまなモードで実行でき、さまざまなシナ...

Linux システムで Centos7 を使って ElasticSearch ミドルウェアと共通インターフェースを構築するデモ

1. ミドルウェアの紹介1. 基本概念ElasticSearch は Lucene をベースにした検...

Docker で MySQL サービスをデプロイする方法と、遭遇する落とし穴

最近、ポーターを学んでいます。こんなに強力なものがあったなんて、今まで知らなかった気がします。クラス...

Dockerコンテナを使用してプロキシ転送とデータバックアップを実装する方法

序文アプリケーションを Docker コンテナとしてサーバーにデプロイする場合、通常はネットワークと...

JS の原価と基準価額の問題に関する簡単な分析

プリミティブ値 -> プリミティブ型Number String Boolean undefin...

Windows10システムにスーパーセットをインストールする手順

Superset は、エレガントなインターフェースとデータ テーブルに基づく動的なデータ生成を主な機...

Tomcatの各ポートの機能の詳細な説明

tomcat 設定ファイルから、tomcat の起動時にデフォルトで 8080 (8443)、800...

ウェブデザインの初心者に役立つ学習教材をいくつかお勧めします

勉強中に読んだ本についてもよく聞かれます。以下は初心者におすすめの本です(私が勉強中に読んだ本です。...

時間のかかるMySQLレコードのSQL例の詳細な説明

mysqlは時間のかかるSQLを記録しますMySQL は、最適化と分析のために、時間のかかる SQL...

JavaScript イベント キャプチャ バブリングとキャプチャの詳細

目次1. イベントの流れ1. コンセプト2. DOMイベントフロー2. イベントの委任1. イベント...

CSS3 Flex エラスティックレイアウトのサンプルコードの詳細な説明

1. 基本概念 //任意のコンテナを Flex レイアウトとして指定できます。 。箱{ ディスプレイ...

黒、白、グレーの控えめでエレガントなウェブデザインを鑑賞

クラシックな色の組み合わせの中でも、黒、白、グレーの時代を超えた魅力を否定できる人はおそらくいないで...