Nginx の書き換え正規マッチング書き換え方法の例

Nginx の書き換え正規マッチング書き換え方法の例

Nginx の書き換え機能は、リダイレクトと同様に、URL アドレスを一時的または永続的に新しい場所にリダイレクトする、通常の一致する書き換えをサポートしています。この機能は、Web サイトの構造に大きな変更を加えたときに役立ちます。たとえば、Web サイトの mp3 リソースは以前は URL www.site1.org/mp3 を使用してアクセスされていましたが、現在はサーバー上の mp3 ディレクトリが music ディレクトリに置き換えられています。この場合、書き換え機能を簡単に実装できます。次に、site1.org を www.site1.org に強制的に調整したり、その逆を行ったりすることができます。このディレクティブは、ngx_http_rewrite_module モジュールにあります。この記事では主にこの命令の使用方法を説明し、デモンストレーションを行います。

1. コマンド構文の説明を書き直す

構文: rewrite regex replacement [flag];
デフォルト: -
コンテキスト: サーバー、場所、if

指定された正規表現がリクエスト URI と一致する場合、URI は置換文字列で指定されたとおりに変更されます。
書き換えディレクティブは、構成ファイルに表示される順序で順番に実行されます。フラグを使用して、ディレクティブの以降の処理を終了することができます。
置換文字列が「http://」、「https://」、または「$scheme」で始まる場合、処理は停止し、リダイレクトがクライアントに返されます。

このフラグは、対応する書き換えルールに一致した後、後続の書き換えルールのチェックを続行するかどうかを制御するために使用されます。オプションのフラグ パラメータは、次のいずれかになります。

最後
リクエストが現在のルールに一致して書き換えられると、他の後続の書き換えルールのチェックが直ちに停止され、書き換えられたルールを使用してリクエストが再開されます。

壊す
現在のルールが一致してコンテンツを書き換えると、後続の書き換えルールは直ちに停止され、nginx は後続の操作を続行します。

リダイレクト
置換文字列が「http://」、「https://」、または「$scheme」で始まっていない場合は、それが使用され、302 一時リダイレクトが返されます。

永続
301 永続リダイレクトを返します。

注: 通常、break フラグは、rewrite が location に書き込まれる場合、または rewrite が if コンテキストに書き込まれる場合に使用されます。

その他の指示

ログの書き換えオン|オフ
書き換えプロセスをエラー ログに記録するかどうか。デフォルトは通知レベルです。デフォルトはオフです。

戻りコード:
書き換えルールを終了し、クライアントにステータス コードを返すために使用されます。使用可能なステータス コードには、204、400、402 ~ 406、500 ~ 504 などがあります。

2. 位置コンテキストに基づく書き換え機能のデモンストレーション

ローカル環境# more /etc/redhat-release
 CentOS Linux リリース 7.2.1511 (コア)
 nginx の -v を実行します。
 nginx バージョン: nginx/1.12.2

nginxの設定
 # vim /etc/nginx/conf.d/rewrite.conf
 サーバー{
  聞く 80;
  サーバー名 site1.orag www.site1.org;

  位置 / {
    ルート /www/site1.org;
    インデックス index.html index.htm;
  }
 }

 # mkdir -pv /www/site1.org/images
 # echo "これは書き換えテストページです。" >/www/site1.org/index.html
 # cp /usr/share/backgrounds/gnome/*.jpg /www/site1.org/images/

 # vim /etc/hosts
 192.168.1.175 サイト1.org
 192.168.1.175 www.site1.org

 # カール http://www.site1.org
 これは書き換えテストページです。

 # curl -I upload/2022/web/Waves.
 HTTP/1.1 200 OK
 サーバー: nginx/1.12.2
 日付: 2017 年 11 月 1 日水曜日 03:47:58 GMT
 コンテンツタイプ: image/jpeg
 コンテンツの長さ: 458818
 最終更新日: 2017年11月1日水曜日 03:43:48 GMT
 接続: キープアライブ
 ETag: "59f942f4-70042"
 受け入れ範囲: バイト

rewrite.confファイルを修正し、書き換えディレクティブlocation / {を追加します。
  ルート /www/site1.org;
  インデックス index.html index.htm;
  ^/images/(.*)$ /imgs/$1 を最後に書き換えます。
 }

 # systemctl nginx をリロードします

 # curl -I upload/2022/web/Waves.
 HTTP/1.1 404 見つかりません
 サーバー: nginx/1.12.2
 日付: 2017 年 11 月 1 日水曜日 04:02:38 GMT
 コンテンツタイプ: text/html
 コンテンツの長さ: 169
 接続: キープアライブ

 # mkdir -pv /www/site1.org/imgs

 # mv /www/site1.org/images/Waves.jpg /www/site1.org/imgs/.
 # curl -I upload/2022/web/Waves.
 HTTP/1.1 200 OK
 サーバー: nginx/1.12.2
 日付: 2017 年 11 月 1 日 (水) 04:05:07 GMT
 コンテンツタイプ: image/jpeg
 コンテンツの長さ: 458818
 最終更新日: 2017年11月1日水曜日 03:43:48 GMT
 接続: キープアライブ
 ETag: "59f942f4-70042"
 受け入れ範囲: バイト

 # curl -I upload/2022/web/Waves. ##このメソッドはHTTP/1.1 200 OKにアクセスできます
 サーバー: nginx/1.12.2
 日付: 2017 年 11 月 1 日水曜日 04:06:17 GMT
 コンテンツタイプ: image/jpeg
 コンテンツの長さ: 458818
 最終更新日: 2017年11月1日水曜日 03:43:48 GMT
 接続: キープアライブ
 ETag: "59f942f4-70042"
 受け入れ範囲: バイト

書き換えによって発生する http 500 エラーをシミュレートするには、rewrite.conf ファイルを次のように変更します。

 位置 / {
  ルート /www/site1.org;
  インデックス index.html index.htm;
  ^/images/(.*)$ /imgs/$1 を最後に書き換えます。
  ^/imgs/(.*)$ /images/$1 を書き換えます。
 }

 # systemctl nginxを再起動します
 # curl -I upload/2022/web/Waves.
 HTTP/1.1 500 内部サーバーエラー
 サーバー: nginx/1.12.2
 日付: 2017年11月1日水曜日 05:23:16 GMT
 コンテンツタイプ: text/html
 コンテンツの長さ: 193
 接続: 閉じる

 # curl -I upload/2022/web/Waves.
 HTTP/1.1 500 内部サーバーエラー
 サーバー: nginx/1.12.2
 日付: 2017年11月1日水曜日 05:23:28 GMT
 コンテンツタイプ: text/html
 コンテンツの長さ: 193
 接続: 閉じる

上記のテストは、500 エラーが無限ループによって発生することを示しています。
Nginx が提供する参考例:
 サーバー{
  ... ##rewrite ディレクティブはサーバー コンテキストにあります rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last;
 ##メディアディレクトリを含む /download ディレクトリ内のファイルリクエストを donwload/any/mp3/any.mp3 にリダイレクトします

 最後に ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra を書き換えます。
 ##オーディオディレクトリを含む /download ディレクトリ内のファイルリクエストを donwload/any/mp3/any.mp3 にリダイレクトします

 403 を返します。
  ...
 }

 location /download/ { ##rewrite ディレクティブは location コンテキスト内にあります rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break;
 ## 最後のフラグは break に置き換える必要があります。そうしないと、nginx は 10 サイクルで 500 エラーを返します。 rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra break;
 403 を返します。
 }

3. if条件に基づく書き換え関数のデモンストレーション

 # vi /etc/nginx/conf.d/rewrite.conf
  サーバー{
    聞く 80;
    サーバー名 site1.orag www.site1.org;

   $host が 'www.site1.org' の場合 {
     書き換え^/(.*)$ http://www.site1.org/$1 永久的;
    }

  場所 / { ##著者: Leshami
    ルート /www/site1.org; ##ブログ: http://blog.csdn.net/leshami
    インデックス index.html index.htm;
    ^/images/(.*)$ /imgs/$1 を最後に書き換えます。
    ^/imgs/(.*)$ /images/$1 を書き換えます。
  }
 }

 # systemctl nginx.service をリロードします

ローカルテスト(ローカルホストファイルの変更)
 # カール http://site1.org
 <html> ## 301 ステータス コードを返す <head><title>301 Moved Permanently</title></head>
 <body bgcolor="white">
 <center><h1>301 永久に移動しました</h1></center>
 <hr><center>nginx/1.12.2</center>
 </本文>
 </html>

Windows環境のテスト WindowsマシンのHostファイルを変更した後、次のエントリを追加します 192.168.1.175 centos7-router.com
 192.168.1.175 www.centos7-router.com

ブラウザを開き、ドメイン名で http://site1.org にアクセスすると、自動的に http://www.site1.org にジャンプします (デモは省略)

4. httpをhttpsに書き換える

サイト全体がhttpsでない場合は、一部の機密データはhttpsを経由する必要がありますが、これは書き換えによっても実現できます。

次の例では、ディレクトリ https://www.site1.org/user に機密情報が含まれていると仮定すると、次のように書き換えることができます。

 場所 ^~ /ユーザー {
 書き換え^/ https://www.site1.org$request_uri?permanent;
 }

サイト全体はhttpsです
 サーバー{
  聞く 80;
  サーバー名 site1.orag www.site1.org;
  アクセスログ /var/log/nginx/http-access.log;
  エラーログ /var/log/nginx/http-error.log;

  書き換え^/ https://www.site1.org$request_uri;
 }

上記のデモンストレーションは簡単に言えば

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

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

<<:  MySQL データベースに基づくデータ制約の例と 5 つの整合性制約の紹介

>>:  React構成サブルーティングの実装

推薦する

Tomcat を使用して Centos 環境に SpringBoot WAR パッケージをデプロイする

戦争パッケージを準備する1. 既存のSpringBootプロジェクトを準備し、pomに依存関係を追加...

JS関数の継承について学ぶ記事

目次1. はじめに: 2. プロトタイプチェーン継承: 3. コンストラクタ継承の借用(オブジェクト...

Ubuntu 18.04 (物理マシン) で OpenWRT 開発環境を構成する方法

1. 仮想マシン(物理マシン)をインストールする仮想マシンまたは物理マシンにインストールできます。 ...

MySQL ストレステストツールの使い方

1. MySQL 独自のストレステストツール - Mysqlslap mysqlslap は、mys...

MySQLリモート接続失敗の解決策

以前、MySQLがローカルでは接続できるのにリモートでは接続できないという問題に遭遇したことがありま...

NGINXがウェブサイトのPV、UV、独立IPをカウントする方法の詳細な説明

Nginx: PV、UV、独立IPウェブサイトを作成する人なら誰でも、ウェブサイトのPV、UV、その...

Dockerコンテナ内の設定ファイルの変更の実装

1. コンテナに入るdocker run [オプション] イメージ名 [起動コンテナに渡されるコマン...

MySQL 変数宣言とストアド プロシージャの分析

変数の宣言グローバル変数の設定@a='新しい変数' を設定します。関数やストアドプロ...

CSS テキスト強調を使用してテキストを強調するための実装コード

1. はじめにこれまで、テキストの特定の部分を強調したい場合、通常は太字にしたり明るい色を使用したり...

Windows7 での Mysql5.7 my.ini ファイルの読み込みパスとデータの場所の変更方法

更新: MySQL の公式 Web サイトにアクセスして MySQL インストーラーをインストールし...

MySQL Binlog ログの読み取り時によくある 3 つのエラー

1. mysqlbinlog: [エラー] 不明な変数 'default-character...

CSS で 3D ルービック キューブを実装するサンプル コード

今日は簡単な3Dルービックキューブを作ってみましょうまずはレンダリングを見てみましょう!これを学んだ...

Google 翻訳ツール: 多言語ウェブサイトを素早く実装

Google Chinaは、ウェブサイトやブログを素早く簡単に多言語化できる翻訳ツールをリリースした...

WAMPにインストールするとMySQLが起動できるが、再起動後に起動できなくなる問題の解決方法

初めてwampをインストールした後、すべてのサービスが正常に使用できますが、再起動するとwampのア...