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

推薦する

Linuxでawkを使用する方法の詳細な説明

awk を学ぶ前に、sed、grep、tr、cut などのコマンドを学んでおく必要があります。これら...

Node.js で簡単なクローラーケースを作成するチュートリアル

準備まず、nodejs をダウンロードする必要がありますが、これは問題ないはずです。原文はwebst...

Linux でプロセスを効果的に管理するための 8 つのコマンド

序文プロセス管理の役割:サーバーの健全性状態を判定する: プロセスの状態 (メモリ、CPU 占有率な...

「MySQL サービスを開始できません エラー 1069」を解決する方法

今日、外出中に同僚から、ウェブサイトのバックエンドにアクセスできないというメッセージが届きました。と...

MySQL テーブルとデータベースでデータを分割する方法

目次1. 縦方向のスライス1.1 垂直データベース1.2 垂直テーブル分割2. 水平(横断)セグメン...

中国の専門ではない:文化の違いの中でのウェブ開発

Web デザインと開発は大変な作業なので、少数の人だけを対象に設計しないでください。これは外国人が...

Nginx は https ウェブサイト構成コード例を実装します

https ベースポート 443。これはキーと呼ばれるものに使用されます。これらのことを理解せずにで...

Linux の Centos7 に Mysql5.7.19 をインストールする詳細なチュートリアル

1. MySQLをダウンロードするURL: https://dev.mysql.com/downlo...

Reactは適応性の高い仮想リストを実装する

目次変換前:変換後: 0x0の基本0x1 「固定高さ」の仮想リストを実装する原理:最適化: 0x2 ...

Linux で完全な Samba サーバーを構築する方法 (CentOS バージョン)

序文smb は、クライアントとサーバー間の Web 接続および情報通信に使用できるプロトコルの名前で...

HTML で入力ボックスに純粋な数字のみを入力するように制限する方法

inputボックスを純粋な数字のみに制限する1、onkeyup = "value=valu...

Web 標準アプリケーション: Tencent QQ ホームページの再設計

Tencent QQのホームページがリニューアルされ、Webフロントエンド開発がますます注目を集めて...

Docker で Spring-boot プロジェクトをデプロイするためのサンプル コード

1. 基本的な Spring-boot クイックスタート1.1 クイックスタート pom.xml は...

JavaベースのMySQLバックアップテーブル操作

コアはmysqldumpとランタイムです操作は実際にはそれほど難しくありません。バックアップ操作を実...

1 時間で MySQL データベースを学ぶ (Zhang Guo)

目次1. データベースの概要1.1 開発の歴史2. MySQL の紹介2.1. MySQLの概要2....