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をインストールする詳細な手順

推薦する

div の高さをブラウザの高さに合わせて調整する方法

この古くからある疑問は、数え切れないほどのフロントエンド開発者やバックエンドプログラマーを悩ませてき...

HTML 5 ワーキングドラフトの謎を解く

World Wide Web Consortium (W3C) は、HTML 5 仕様のドラフトをリ...

Mysqlチュートリアルでのグループランキングの実装例の詳細な説明

目次1. データソース2. データの総合順位1) 総合ランキング2) 同順位3) 同順位3. データ...

JavaScript を使用して div の位置をドラッグして入れ替える例

1 実施原則これは、DOM 要素の dragstart/ondragover/ondrop イベント...

Linux mysql5.5 を mysql5.7 にアップグレードする手順と落とし穴

目次Linux MySQL 5.5 が MySQL 5.7 にアップグレードされました1. mysq...

MySQLデータベースのQPSとTPSの意味と計算方法

DB ベンチマーク テストを実行する場合、qps と tps はデータベースのパフォーマンスを測定す...

よく使われるCSSスタイル(レイアウト)の詳しい説明

新しいCSS3プロパティと互換性ありCSS3では、プラグインprefixfree.min.jsを使用...

Webフロントエンドツール、Sublime Text 2の紹介

Sublime Text 2 は、軽量でシンプル、効率的なクロスプラットフォーム エディターです。ブ...

Linux の一般的なテキスト処理コマンドと vim テキストエディタ

今日は、いくつかの一般的なテキスト処理コマンドとvimテキストエディタを紹介します。 3日目 - 一...

mysqlはエクスポートされたデータのsqlファイルから指定されたテーブルのみをインポートすることを実装します

シナリオ昨日、システムは dbAll.sql.gz という名前の特定のデータベースのすべてのテーブル...

Docker 基本チュートリアル: Dockerfile 構文の詳細な説明

序文Dockerfile は Docker プログラムによって解釈されるスクリプトです。Docker...

CSSアニメーションを途中で止めて姿勢を維持する方法

序文かつて、難しい問題に遭遇しました。タワークレーンからスイングハウスを落下させる必要がありましたが...

JavaScript 高度なカスタム例外

目次1. コンセプト1.1 エラーと例外とは何ですか? 1.2 異常の分類2. 例外処理2.1try...

シェルスクリプトはNginxのaccess.logのPVを定期的にカウントし、APIに送信してデータベースに保存します。

1. PVとIPの統計一日のPV(ページビュー)をカウントする cat access.log | ...

Nginxサービス500:内部サーバーエラーの原因の1つ

500 (内部サーバー エラー) サーバーでエラーが発生したため、要求を完了できませんでした。 50...