Nginx転送マッチングルールの実装

Nginx転送マッチングルールの実装

1. 正規表現マッチング

  • 大文字と小文字を区別するマッチングの場合 ~
  • ~*は大文字と小文字を区別しないマッチングです
  • !~ と !~* は、それぞれ大文字と小文字を区別する一致と大文字と小文字を区別しない一致です。

2. ファイルとディレクトリのマッチング

  • -f と !-f はファイルが存在するかどうかを判断するために使用されます
  • -dと!-dはディレクトリが存在するかどうかを判断するために使用されます
  • -e と !-e はファイルまたはディレクトリが存在するかどうかを判断するために使用されます
  • -xと!-xはファイルが実行可能かどうかを判断するために使用されます

三つ。書き換えコマンドの最後のパラメータはフラグタグであり、

  • last は Apache の [L] フラグに相当し、書き換えを意味します。
  • break このルールが一致すると、一致は終了し、次のルールは一致しなくなります。
  • リダイレクトは 302 一時リダイレクトを返し、ブラウザ アドレスにはジャンプ後の URL が表示されます。
  • permanent は 301 永続リダイレクトを返し、ブラウザ アドレスにはジャンプ後の URL が表示されます。

ブラウザのアドレスバーを変更せずに URI を書き換えるには、last と break を使用します。

2 つには微妙な違いがあります。alias ディレクティブを使用する場合は、最後のマーカーを使用する必要があります。proxy_pass ディレクティブを使用する場合は、break マーカーを使用する必要があります。この書き換えルールの実行後、最後のタグはそれが配置されている server{......} タグへのリクエストを再開し、break タグはこのルールのマッチングが完了した後にマッチングを終了します。

たとえば、 URL/photo/123456 /path/to/photo/12/1234/123456.png
にリダイレクトする場合/path/to/photo/12/1234/123456.png

「/photo/([0-9]{2})([0-9]{2})([0-9]{2})」を書き換える 
「/path/to/photo/$1/$1$2/$1$2$3.png」を書き換えます。

4. NginxRewriteルール関連の手順

1. ブレーク命令

使用環境: サーバー、場所、場合
このディレクティブの目的は、現在のルール セットを完了し、書き換えディレクティブを処理しないようにすることです。

2. if命令

使用環境: サーバー、場所
この命令は、条件が満たされているかどうかを確認するために使用されます。条件が満たされると、中括弧内のステートメントが実行されます。 If ディレクティブは、ネスト、複数の条件付き && および || 処理をサポートしていません。

3. 返品指示

構文: 戻りコード
使用環境: サーバー、場所、場合
この命令は、ルールの実行を終了し、クライアントにステータス コードを返すために使用されます。
例: アクセスしたURLが「.sh」または「.bash」で終わる場合、403ステータスコードが返されます。

場所 ~ .*\.(sh|bash)?$
{
 403 を返します。
}

4. 書き換えディレクティブ

構文: rewriteregex replacement flag
使用環境: サーバー、場所、場合
このディレクティブは、式に基づいて URI をリダイレクトするか、文字列を変更します。ディレクティブは、構成ファイルに表示される順序で実行されます。書き換え式は相対パスでのみ機能することに注意してください。ホスト名を一致させたい場合は、次のように if ステートメントを使用する必要があります。

$host が ~* www\.(.*) の場合
{
 $host_without_www を $1 に設定します。
 ^(.*)$ http://$host_without_www$1permanent を書き換えます。
}

5. コマンドの設定

構文: setvariable value;
デフォルト値: なし
使用環境: サーバー、場所、場合
この命令は、変数を定義し、その変数に値を割り当てるために使用されます。変数の値は、テキスト、変数、またはテキストと変数の組み合わせにすることができます。

$varname に「hello world」を設定します。

6. Uninitialized_variable_warn ディレクティブ

構文: uninitialized_variable_warnon|off
使用環境: http、サーバー、場所、if
このコマンドは、初期化されていない変数の警告メッセージをオンまたはオフにするために使用されます。デフォルト値はオンです。

五。 Nginx Rewriteルールの記述例

1. アクセスしたファイルまたはディレクトリが存在しない場合は、HTMLファイルにリダイレクトします。

if( !-e $リクエストファイル名 )
{
 ^/(.*)$ index.htmllast を書き換えます。
}

2. ディレクトリスワップ /123456/xxxx ====> /xxxx?id=123456

^/(\d+)/(.+)/ /$2?id=$1 を最後に書き換えます。

3. クライアントがIEブラウザを使用している場合は、/ieディレクトリにリダイレクトします。

if($http_user_agent ~ MSIE)
{
 書き換え^(.*)$ /ie/$1 break;
}

4. 複数のディレクトリへのアクセスを禁止する

場所 ~ ^/(cron|テンプレート)/
{
 すべてを否定する;
 壊す;
}

5. /dataで始まるファイルへのアクセスを禁止する

場所 ~ ^/データ
{
 すべてを否定する;
}

6. 拡張子が.sh、.flv、.mp3のファイルへのアクセスを禁止する

場所 ~ .*\.(sh|flv|mp3)$
{
 403 を返します。
}

7. 特定の種類のファイルのブラウザキャッシュ時間を設定する

場所 ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
 有効期限は30日です。
}
場所 ~ .*\.(js|css)$
{
 1時間で期限切れになります。
}

8. favicon.icoとrobots.txtの有効期限を設定する

ここでは、favicon.ico は 99 日間、robots.txt は 7 日間、404 エラー ログは記録されません。

場所 ~(favicon.ico) {
 log_not_found オフ;
 有効期限は99日です。
 壊す;
}
場所 ~(robots.txt) {
 log_not_found オフ;
 有効期限は7日です。
 壊す;
}

9. ファイルの有効期限を設定します。ここでは600秒に設定されており、アクセスログは記録されません。

場所 ^~ /html/scripts/loadhead_1.js {
 access_log オフ;
 ルート /opt/lampp/htdocs/web;
 有効期限600;
 壊す;
}

10. ファイルのホットリンク防止と有効期限の設定

ここでのreturn412はカスタムhttpステータスコードであり、デフォルトは403です。これは正しいホットリンクリクエストを見つけるのに便利です。

書き換え^/ http: //img.linuxidc.net/leech.gif; // リーチ防止画像を表示 access_log off; // 負荷を軽減するためアクセスログを記録しない expires 3d // 3日間の全ファイルのブラウザキャッシュ location ~*^.+\.(jpg|jpeg|gif|png|swf|rar|zip|css|js)$ {
 valid_referers なしブロック *.linuxidc.com*.linuxidc.net localhost 208.97.167.194;
($invalid_referer) の場合 {
  書き換え^/ upload/2022/web/leech.gif;
  412 を返します。
  壊す;
}
access_log オフ;
ルート /opt/lampp/htdocs/web;
有効期限は3日です。
壊す;
}

11. 固定IPのみウェブサイトへのアクセスを許可し、パスワードを追加する

ルート /opt/htdocs/www;
208.97.167.194 を許可します。 
222.33.1.2 を許可します。 
231.152.49.4 を許可します。
すべてを否定する;
auth_basic "C1G_ADMIN";
auth_basic_user_file htpasswd;

12. 複数のディレクトリにあるファイルを1つのファイルに変換してSEO効果を高める

/job-123-456-789.html/job/123/456/789.htmlを指します。

最後に^/job-([0-9]+)-([0-9]+)-([0-9]+)\.html$ /job/$1/$2/jobshow_$3.htmlを書き換えます。

13. ファイルとディレクトリが存在しない場合にリダイレクトする:

if (!-e $request_filename) {
 プロキシパス http://127.0.0.1;
}

14. ルートディレクトリ内のフォルダを第2レベルのディレクトリにポイントする

たとえば、 /shanghaijob//area/shanghai/を指します。

lastをpermanentに変更すると、ブラウザのアドレスバーに/location/shanghai/
と表示されます。 /location/shanghai/

^/([0-9a-z]+)job/(.*)$ /area/$1/$2last を書き換えます。

上記の例の問題点は、/shanghaiにアクセスしたときに一致しないことです。

^/([0-9a-z]+)job$ /area/$1/ を最後に書き換えます。
^/([0-9a-z]+)job/(.*)$ /area/$1/$2last を書き換えます。

この方法では、 /shanghaiにもアクセスできますが、ページ内の相対リンクは使用できません。

たとえば、 ./list_1.htmlの実際のアドレスが/area/shanghia/list_1.htmlの場合、 /list_1.htmlになり、アクセスできなくなります。

次に自動ジャンプを追加しますが、機能しません。

(-d $request_filename)実際のディレクトリでなければならないという条件がありますが、私の書き換えではそうではないので効果がありません

if (-d $リクエストファイル名){
^/(.*)([^/])$ http://$host/$1$2/permanent を書き換えます。
}

理由が分かれば対処は簡単です。手動でジャンプしてみましょう。

^/([0-9a-z]+)job$ /$1job/permanent を書き換えます。
^/([0-9a-z]+)job/(.*)$ /area/$1/$2last を書き換えます。

15. ドメインジャンプ

サーバ{
 聞く 80;
 サーバー名 jump.linuxidc.com;
 インデックス index.html index.htm index.php;
 ルート /opt/lampp/htdocs/www;
 書き換え^/ http://www.linuxidc.com/;
 access_log オフ;
}

16. マルチドメインリダイレクト

サーバー名 www.linuxidc.comwww.linuxidc.net;
インデックス index.html index.htm index.php;
ルート /opt/lampp/htdocs;
$host が "linuxidc\.net" の場合 {
 書き換え^(.*) http://www.linuxidc.com$1permanent;
}

6. nginx グローバル変数

arg_PARAMETER #この変数には、GET リクエスト内の変数 PARAMETER の値(存在する場合)が含まれます。
args #この変数は、リクエスト ライン (GET リクエスト) 内のパラメータと同じです (例: foo=123&bar=blahblah;)。
binary_remote_addr #バイナリクライアントアドレス。
body_bytes_sent #応答で送信された本文のバイト数。接続が失われた場合でも、このデータは正確です。
content_length #リクエスト ヘッダー内の Content-length フィールド。
content_type #リクエスト ヘッダーの Content-Type フィールド。
cookie_COOKIE #Cookie COOKIE 変数の値 document_root #現在のリクエストのルート ディレクティブで指定された値。
document_uri #uriと同じです。
host #リクエストホストヘッダーフィールド、それ以外の場合はサーバー名。
ホスト名 #gethostname によって返されるマシンのホスト名に設定します
http_ヘッダー
is_args # args パラメータがある場合、この変数は「?」に等しくなり、そうでない場合は空の値「」に等しくなります。
http_user_agent #クライアントエージェント情報 http_cookie #クライアントクッキー情報 limit_rate #この変数は接続速度を制限できます。
query_string #args と同じです。
request_body_file #クライアントのリクエスト本体情報の一時ファイル名。
request_method #クライアントが要求したアクション。通常は GET または POST です。
remote_addr #クライアントのIPアドレス。
remote_port #クライアントポート。
remote_user #Auth Basic モジュールによって検証されたユーザー名。
request_completion #リクエストが完了した場合は、OK に設定されます。リクエストが完了していない場合、またはリクエストがリクエスト チェーンの最後のものではない場合は、空になります。
request_method #GET または POST
request_filename #ルートまたはエイリアス ディレクティブと URI リクエストによって生成された現在のリクエストのファイル パス。
request_uri #ホスト名なしのリクエストパラメータを含む元のURI(例:"/foo/bar.php?arg=baz")。変更できません。
スキーム #HTTP メソッド (http、https など)。
server_protocol #リクエストで使用されるプロトコル。通常は HTTP/1.0 または HTTP/1.1。
server_addr #サーバーアドレス。この値はシステムコールの完了後に決定できます。
server_name #サーバー名。
server_port #リクエストがサーバーに到着するポート番号。

7. ApacheとNginxのルールの対応

ApacheのRewriteCondはNginxのifに相当する
ApacheのRewriteRuleはNginxのrewriteに対応する
Apacheの[R]はNginxのリダイレクトに相当する
Apacheの[P]はNginxの最後の
Apacheの[R,L]はNginxのリダイレクトに対応する
Apacheの[P,L]はNginxの最後の
Apacheの[PT,L]はNginxの最後の

たとえば、指定されたドメイン名がこのサイトにアクセスできるようにすると、他のすべてのドメイン名は www.jb51.net にリダイレクトされます。

アパッチ:

書き換え条件 %{HTTP_HOST} !^(.*?)\.aaa\.com$[NC]
書き換え条件 %{HTTP_HOST} !^localhost$ 
書き換え条件 %{HTTP_HOST}!^192\.168\.0\.(.*?)$
書き換えルール ^/(.*)$ //www.jb51.net[R,L]

Nginx フィルタリングの例:

if( $host ~* ^(.*)\.aaa\.com$ )
{
 $allowHost を '1' に設定します。
}
if($host ~* ^localhost) の場合
{
 $allowHost を '1' に設定します。
}
$host ~* ^192\.168\.1\.(.*?)$ の場合
{
 $allowHost を '1' に設定します。
}
$allowHost !~ '1' の場合
{
 ^/(.*)$ //www.jb51.netredirect を書き換えます。
}

要約する

バックエンド開発は、フルスタックの仕事に最も近い職業です。フロントエンドが不十分な場合は、バックエンドがその上にページのJSを書くことができます。運用と保守がなくても問題ありません。バックエンドがサーバーを維持します。つまり、優れたバックエンドはすべての側面をカバーできます。

Nginx 転送マッチングルールの実装に関するこの記事はこれで終わりです。より関連性の高い Nginx 転送マッチングルールについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Nginx ロケーションマッチングルールの詳細な説明
  • Nginx の書き換え正規マッチング書き換え方法の例
  • Nginx ロケーション ディレクティブ URI マッチング ルールの詳細な概要
  • Nginx ロケーションマッチングルールの例
  • nginx を使用して複数の条件を一致させる方法
  • nginx マッチングルールの簡単な概要 (推奨)
  • Nginxのさまざまなマッチング方法の詳細な説明

<<:  jQueryはフォントサイズ調整ケースを実装します

>>:  win10にmysql 8.0.18-winx64をインストールする詳細な手順

推薦する

echartsマップカルーセルハイライトを解決するための記事

目次序文やることリストやるだけ地図を準備するインスタンスをバックアップ用に保存するタイマーカルーセル...

JavaScript を使用したコマンドライン アプリケーションの構築

目次1. ノードをインストールする2. Commander.jsをインストールする3. JavaSc...

HTML入力ボックスの最適化により、ユーザーエクスペリエンスと使いやすさが向上します。

ユーザーエクスペリエンスと使いやすさを向上させるために、入力ボックスなど、Web ページでユーザーが...

Linux で複数の mysql5.7.19 (tar.gz) ファイルをインストールする方法

LinuxでのMySQL-5.7.19バージョンの初心者向けの最初のインストールについては、前の記事...

JavaScriptを使って動的にテーブルを生成するケースの詳しい説明

目次序文実装のアイデア実装コード成果を達成する序文これは、テーブルを動的に追加する例です。[追加] ...

Tomcat Nginx Redis セッション共有プロセス図

1. 準備ミドルウェア: Tomcat、Redis、Nginx Jar パッケージ: commons...

MySQL システム ユーザーが開くことができるファイルの最大数に関する簡単な説明

本から学ぶことは常に浅はかで、これがさらなるダウンタイムを引き起こすことには決して気づきません......

Linux で独自の Nexus プライベート サーバーを構築する方法

この記事では、Linuxサーバー上でDockerを使用してNexusプライベートサーバーを構築する方...

ウェブページからテキスト透かしを削除する2つの簡単な方法

<br /> 特定の Web サイトを閲覧して、優れた Web ページを見つけた場合、そ...

docker-compsoe を使用してフロントエンドとバックエンドを分離したプロジェクトをデプロイする方法

事前に言っておくDocker を使用すると非常にシンプルなデプロイメント環境を実現できることは誰もが...

HTMLタグのtarget属性の使用法

1: <a> タグを使用してページにリンクする場合、target 属性の役割は誰もが知っ...

mysql 変数の使用例の分析 [システム変数、ユーザー変数]

この記事では、例を使用して MySQL 変数の使用方法を説明します。ご参考までに、詳細は以下の通りで...

Docker+Jenkinsを使用して自動的にビルドおよびデプロイする

この記事では、Docker+Jenkins の自動ビルドデプロイメントを紹介し、皆さんと共有します。...

Vue カプセル化に基づくプルダウン更新およびプルアップ読み込みコンポーネント

VueとネイティブJavaScriptカプセル化に基づいて、プルダウンリフレッシュとプルアップロード...

Vue の双方向イベントバインディング v-model の原理についての簡単な説明

目次説明する:要約する補充するDOM を直接変更して操作する js や jQuery とは異なり、V...