よく使われるnginxの書き換えルールの詳細な説明

よく使われるnginxの書き換えルールの詳細な説明

この記事では、Web ページのリンクを美しくするためによく使用される書き換えルールをいくつか紹介します。ルール内の $1$2 がどこから来るのかわからない場合は、最初の () が $1 で、2 番目の () が $2 であ​​ることを覚えておいてください。

要求された URL は人間が見るためのものであり、書き換えられた URL はコンピュータが見るためのものです。

検索を実行する

このルールの目的は、URL に含まれるキーワードの検索を実行することです。

要求された URL: //hqidi.com/search/some-search-keywords
書き換えられた URL: //hqidi.com/search.php?p=some-search-keywords
書き換えルール rewrite ^/search/(.*)$ /search.php?p=$1?;

ユーザープロフィールページ

訪問者登録を実行するほとんどの動的 Web サイトには、プロファイルを表示できるページが用意されています。このページの URL には、ユーザーの UID とユーザー名が含まれています。

要求された URL: //hqidi.com/user/47/dige
書き換えられた URL //hqidi.com/user.php?id=47&name=dige
書き換えルール rewrite ^/user/([0-9]+)/(.+)$ /user.php?id=$1&name=$2?;

複数のパラメータ

一部のサイトでは、名前のないパラメータを区切るためにスラッシュ「/」を使用するなど、文字列パラメータに異なる構文を使用します。

要求された URL: //hqidi.com/index.php/param1/param2/param3
書き換えられた URL //hqidi.com/index.php?p1=param1&p2=param2&p3=param3
書き換えルール rewrite ^/index.php/(.*)/(.*)/(.*)$ /index.php?p1=$1&p2=$2&p3=$3?;

百科事典のような形式

この形式は、プレフィックスディレクトリの後に記事名が続く形式です。

要求された URL: //hqidi.com/wiki/some-keywords
書き換えられた URL //hqidi.com/wiki/index.php?title=some-keywords
書き換えルール rewrite ^/wiki/(.*)$ /wiki/index.php?title=$1?;

フォーラム

フォーラムでは通常、トピック識別子(トピック)と開始点(開始投稿)の 2 つのパラメータが使用されます。

要求された URL: //hqidi.com/topic-1234-50-some-keywords.html
書き換えられた URL //hqidi.com/viewtopic.php?topic=1234&start=50
書き換えルール rewrite ^/topic-([0-9]+)-([0-9]+)-(.*)\.html$ viewtopic.php?topic=$1&start=$2?;

新しいサイトの記事

この URL 構造は、記事識別子、それに続くスラッシュ、およびキーワードのリストによって特徴付けられます。

リクエストされた URL: //hqidi.com/88/future
書き換えられた URL: //hqidi.com/atricle.php?id=88
書き換えルール rewrite ^/([0-9]+)/.*$ /aticle.php?id=$1?;

最後の疑問符

置換する URI にパラメータ (/app/test.php?id=5 など) が含まれている場合、デフォルトではパラメータが置換文字列に自動的に追加されます。この問題は、置換文字列の末尾に ? マークを追加することで解決できます。

^/users/(.*)$ /show?user=$1? last を書き換えます。

ワンプラスを比較しますか?マークされているかどうか?マークされた URL ジャンプの違い:

^/test(.*)$ //hqidi.com/home を premanent に書き換えます。

//hqidi.com/test?id=5 にアクセスし、301 リダイレクト後、URL アドレスは //hqidi.com/home?id=5 になります。

^/test(.*)$ //hqidi.com/home? premanent を書き換えます。

//hqidi.com/test?id=5 にアクセスすると、301 リダイレクト後の URL は //hqidi.com/home になります。

Nginx の書き換え機能には PCRE ソフトウェアのサポートが必要です。つまり、ルールのマッチングは Perl 互換の正規表現ステートメントを通じて実行されます。デフォルトのパラメータでnginxをコンパイルすると、書き換えモジュールがサポートされますが、PCREのサポートも必要です。

rewrite は URL 書き換えを実装するためのキー命令です。regex (正規表現) 部分に従って置換にリダイレクトし、フラグタグで終了します。

nginx 書き換え命令の実行順序

1. サーバーブロックの書き換え命令を実行します(ここでのブロックは、サーバーキーワードの後の{}で囲まれた領域を指し、他のxxブロックも同様です)
2. 位置マッチングを実行する
3. 選択した場所で書き換え命令を実行する

いずれかのステップで URI が書き換えられると、実際のファイルが見つかるまでステップ 1 ~ 3 がループで再度実行されます。

ループが 10 回を超えると、500 内部サーバー エラーが返されます。

フラグ

rewrite の構文は非常に単純です。

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

rewrite はキーワード、regex は正規表現、URL は置換されるコンテンツ、[flag] はフラグ ビットを意味し、次の値を持ちます。

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

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

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

簡単な例を見てみましょう:

^/listings/(.*)$ /listing.html?listing=$1 を最後に書き換えます。
^/images/(.*)_(\d+)x(\d+)\.(png|jpg|gif)$ /resizer/$1.$4?width=$2&height=$3? を書き換えます。

最初の書き換えルールでは、http://mysite.com/listing.html?listing=123 の代わりに、フレンドリ URL である http://mysite.com/listings/123 を使用できます。これは、ブラウザのアドレス バーに http://mysite.com/listings/123 と入力するのと同じで、実際にアクセスされる URL リソースは http://mysite.com/listing.html?listing=123 です。

2 番目のルールでは、http://mysite.com/images/bla_500x400.jpg 形式のファイル要求がアドレス http://mysite.com/resizer/bla.jpg?width=500&height=400 に書き換えられ、場所の一致が試行され続けます。

if命令とグローバル変数

if 命令の構文は if(condition){...} であり、指定された条件を判断します。 true の場合、中括弧内の書き換えディレクティブが実行されます。

コードのルールを見てみましょう:

$http_user_agent の場合:
  書き換え^(.*)$ /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://mysite.com/ を永久的に書き換えます。
} //クエリ文字列に「post=140」が含まれている場合は、mysite.com に永続的にリダイレクトします

if 命令では、グローバル変数を使用できます。これらの変数は次のとおりです。

  • $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 と同じです。

リターンを使用してジャンプする

場合によっては、次のルールのように、Nginx で rewrite を使用して 301 アドレス ジャンプを実行する必要があります。

^ $scheme://www.mysite.com$request_uri を永続的に書き換えます。

任意の URL にアクセスすると、301 で URL www.mysite.com に永続的にリダイレクトされます。この書き方は正しいのですが、rewrite正規マッチングを使用するため、ある程度のリソースが消費されてしまうため、nginx公式サイトではこの書き方は推奨されていません。 return を使用して 301 リダイレクトを実現することもできます。これはシンプルで実用的です。例をご覧ください。

301 新しいドメイン名に恒久的にリダイレクトします

サーバー{
  聞く 80;
  443 ssl を聴く;
  サーバー名 www.old-name.com old-name.com;
  301 $scheme://www.new-name.com を返します。
}

上記のコードは、古いドメイン名から新しいドメイン名への 301 リダイレクトを実装します。Web サイトを新しいドメイン名に変更する必要がある場合は、この方法を使用して 301 リダイレクトを実行します。

www のないドメインから www のあるドメインへの 301 リダイレクト

サーバー{
  聞く 80;
  443 ssl を聴く;
  サーバー名 mysite.com;
  301 $scheme://www.mysite.com$request_uri を返します。
}

http サイトから https サイトへの 301 リダイレクト

サーバー{
  聞く 80;
  サーバー名 www.mysite.com;
  301 https://www.mysite.com$request_uri を返します。
}

以上がNginxの書き換えとリダイレクトの紹介です。役に立ったと思ったら何度も練習して、迷子にならないようにこの記事を保存しておいてください。皆様も123WORDPRESS.COMを応援して頂ければ幸いです。

以下もご興味があるかもしれません:
  • Nginx の書き換え正規マッチング書き換え方法の例
  • nginx rewriteを使用してURLをリダイレクトする方法
  • nginx 設定の場所の概要の場所の通常の書き込みと書き換えルールの書き込み
  • nginx の設定場所の概要と書き換えルールの記述の詳細な説明
  • URLパラメータに応じたnginxの書き換えと場所の詳細な説明
  • Nginxの書き換えモジュールの詳細な説明

<<:  React で遅延読み込みを使用して最初の画面の読み込み時間を短縮する方法

>>:  データベース接続プール Druid の使用手順

推薦する

Vueはコンピュータカメラを呼び出して写真機能を実現します

この記事の例では、コンピュータカメラを呼び出して写真機能を実現するためのvueの具体的なコードを参考...

よく使われる Docker コマンドと例の概要と分析

目次1. コンテナライフサイクル管理(1)ドッカー実行(2)スタート/ストップ/リスタート(3)ドッ...

CSS3 で作成したホバーズーム効果

結果:実装コード: html <link href='https://fonts.go...

MySQL ユーザー権限管理の分析例

この記事では、MySQL ユーザー権限管理の例について説明します。ご参考までに、詳細は以下の通りです...

vsCodeはワンクリックでvueテンプレートを生成します

1. ショートカットCtrl + Shift + Pを使用してコンソールを呼び出します 2、「スニペ...

React コンポーネント間で通信する 3 つの方法 (シンプルで使いやすい)

目次1. 親子コンポーネント通信2. クロスレベルコンポーネント通信1. レイヤーごとに値を渡す2....

Win10にnginxをインストールして設定するプロセス

1. はじめにNginx は、無料のオープンソースの高性能 HTTP サーバーおよびリバース プロキ...

MySQL 使用仕様の概要

1. InnoDBストレージエンジンを使用する必要がありますCPU と IO のパフォーマンスが向上...

Vue のスロットの使用法と適用シナリオの詳細な分析

スロットとは何ですか? Vue では、子コンポーネント タグの中央に何もラップできないことはわかって...

JavaScript の知識: コンストラクタも関数である

目次1. コンストラクタの定義と呼び出し2. 新しいキーワードの目的3. コンストラクタの問題: メ...

Linuxファイルシステム操作の実装

この読書ノートでは、主にファイルシステムに関連する操作を記録します。ディスクとディレクトリの容量ディ...

エレメントアバターアップロード練習

この記事は、Element公式サイトとQiniu Cloud公式サイトを使用しています。 eleme...

ネイティブJavaScriptでカルーセルを実装する

この記事では、JavaScriptでカルーセルを実装するための具体的なコードを参考までに紹介します。...

MySQLで負荷分散を実装する方法

序文MySQL は、クライアント/サーバー構造に基づく、高速、高性能、マルチスレッドのオープン ソー...

JavaScript で長い画像のスクロール効果を実装する

この記事では、JavaScriptの長い画像スクロールの具体的なコードを参考までに共有します。具体的...