よく使われる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 の使用手順

推薦する

モバイルデバイス上のぼやけた小さなアイコンの問題を解決する方法

序文以前、画像とテキストの垂直方向のずれの問題について説明しました。ここで示した小さな例では、小さな...

Docker Swarm クラスタ管理の使用と原理の分析

Swarm クラスター管理導入Docker Swarm は Docker 用のクラスター管理ツールで...

jQuery ベースのカレンダー効果

この記事では、カレンダー効果を実現するためのjQueryの具体的なコードを例として紹介します。具体的...

HTMLはキャンバスを使用して箇条書きスクリーン機能を実装します

導入最近、大きな課題をこなす際に、弾幕プレイヤーを作る必要がありました。他の人のソースコードを借りて...

航空機戦争ゲームを実装するためのJavaScript

この記事では、キャンバスとjsを使用して簡単な飛行機戦争を実装する方法を参考までに紹介します。具体的...

Angularコンポーネントのライフサイクルの詳しい説明(パート2)

目次1. ビューフック1. ngAfterViewInit および ngAfterViewCheck...

Docker データボリュームの一般的な操作コードの例

開発者が Dockerfile を使用してイメージをビルドする場合は、イメージをビルドするときにデー...

Nginx で Brotli 圧縮アルゴリズムを有効にする方法の例

Brotli は、Zopfli よりも 20 ~ 26% 高い圧縮率を実現できる新しいデータ形式です...

Docker+Selenium Grid に基づく技術アプリケーションをテストするためのサンプル コード

Selenium Grid の紹介Selenium Grid のいくつかの新しい機能は、今後リリース...

Office ファイルのオンライン プレビュー用の Vue サンプル コード

最近、電子アーカイブに取り組んでおり、バックエンドではファイルの Huawei Cloud OSS ...

自動ロック画面機能を実現するjs

1. 使用シナリオこのような要件があるため、システムが開発されました。ユーザーがデスクトップを離れ...

httpsウェブサイトにリファラーhttpsとhttpジャンプリファラーを送信させる方法

この記事では、HTTP プロトコルのリファラーのメタデータ パラメータの提案について説明します。この...

MySQL count(1)、count(*)、count(field)の違い

目次1. COUNTの初見2. COUNT(フィールド)、COUNT(定数)、COUNT(*)の違い...

WeChatアプレット仮想リストの応用例

目次序文仮想リストとは何ですか?デモ効果準備スクリーンの高さとボックスの高さ最適化要約する序文人気の...

TCP 3 回目のハンドシェイク データ転送プロセス図

RFC793 ドキュメントの SYN フラグを持つプロセス パケットはデータを伝送できません。つま...