モジュール ngx_http_rewrite_module

ディレクティブ
     break
     if
     return
     rewrite
     rewrite_log
     set
     uninitialized_variable_warn
内部実装

ngx_http_rewrite_module モジュールは、PCRE 正規表現を使用してリクエスト URI を変更し、リダイレクトを返し、条件付きで設定を選択するために使用されます。

breakifreturnrewrite、および set ディレクティブは、以下の順序で処理されます。

ディレクティブ

構文 break;
デフォルト
コンテキスト serverlocationif

現在の ngx_http_rewrite_module ディレクティブのセットの処理を停止します。

ディレクティブが location 内で指定されている場合、リクエストのさらなる処理はこの location で続行されます。

if ($slow) {
    limit_rate 10k;
    break;
}

構文 if (条件) { ... }
デフォルト
コンテキスト serverlocation

指定された 条件 が評価されます。 true の場合、中括弧内に指定されたこのモジュールのディレクティブが実行され、リクエストには if ディレクティブ内の設定が割り当てられます。 if ディレクティブ内の設定は、前の設定レベルから継承されます。

条件は次のいずれかになります。

if ($http_user_agent ~ MSIE) {
    rewrite ^(.*)$ /msie/$1 break;
}

if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
    set $id $1;
}

if ($request_method = POST) {
    return 405;
}

if ($slow) {
    limit_rate 10k;
}

if ($invalid_referer) {
    return 403;
}

$invalid_referer 埋め込み変数の値は、valid_referers ディレクティブによって設定されます。

構文 return コード [テキスト];
return コード URL;
return URL;
デフォルト
コンテキスト serverlocationif

処理を停止し、指定された コード をクライアントに返します。非標準コード 444 は、レスポンスヘッダーを送信せずに接続を閉じます。

バージョン 0.8.42 以降、リダイレクト URL(コード 301、302、303、307、および 308 の場合)またはレスポンス本文 テキスト(他のコードの場合)のいずれかを指定できます。レスポンス本文テキストとリダイレクト URL には変数を含めることができます。特別な場合として、リダイレクト URL をこのサーバーのローカル URI として指定できます。この場合、完全なリダイレクト URL は、リクエストスキーム($scheme)と server_name_in_redirect および port_in_redirect ディレクティブに従って形成されます。

さらに、コード 302 を使用した一時リダイレクトの URL を唯一のパラメーターとして指定できます。このようなパラメーターは、「http://」、「https://」、または「$scheme」文字列で始まる必要があります。 URL には変数を含めることができます。

バージョン 0.7.51 より前では、次のコードのみを返すことができました:204、400、402〜406、408、410、411、413、416、および 500〜504。

コード 307 は、バージョン 1.1.16 および 1.0.13 まではリダイレクトとして扱われませんでした。

コード 308 は、バージョン 1.13.0 まではリダイレクトとして扱われませんでした。

error_page ディレクティブも参照してください。

構文 rewrite 正規表現 置換文字列 [フラグ];
デフォルト
コンテキスト serverlocationif

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

オプションの フラグ パラメーターは、次のいずれかになります。

last
現在の ngx_http_rewrite_module ディレクティブのセットの処理を停止し、変更された URI と一致する新しい location の検索を開始します。
break
break ディレクティブと同様に、現在の ngx_http_rewrite_module ディレクティブのセットの処理を停止します。
redirect
302 コードで一時リダイレクトを返します。置換文字列が「http://」、「https://」、または「$scheme」で始まらない場合に使用されます。
permanent
301 コードで永続リダイレクトを返します。

完全なリダイレクト URL は、リクエストスキーム($scheme)と server_name_in_redirect および port_in_redirect ディレクティブに従って形成されます。

server {
    ...
    rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last;
    rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra  last;
    return  403;
    ...
}

ただし、これらのディレクティブが「/download/」location 内に配置されている場合、last フラグを break に置き換える必要があります。そうしないと、nginx は 10 サイクルを実行し、500 エラーを返します。

location /download/ {
    rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break;
    rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra  break;
    return  403;
}

置換文字列 に新しいリクエスト引数が含まれている場合、以前のリクエスト引数がそれらの後に追加されます。これが望ましくない場合は、置換文字列の末尾に疑問マークを付けることで、追加されないようにすることができます。例:

rewrite ^/users/(.*)$ /show?user=$1? last;

正規表現に「}」または「;」文字が含まれている場合、式全体を一重引用符または二重引用符で囲む必要があります。

構文 rewrite_log on | off;
デフォルト
rewrite_log off;
コンテキスト httpserverlocationif

ngx_http_rewrite_module モジュールディレクティブの処理結果の error_log へのロギングを notice レベルで有効または無効にします。

構文 set $変数 ;
デフォルト
コンテキスト serverlocationif

指定された 変数 を設定します。 には、テキスト、変数、およびそれらの組み合わせを含めることができます。

構文 uninitialized_variable_warn on | off;
デフォルト
uninitialized_variable_warn on;
コンテキスト httpserverlocationif

初期化されていない変数に関する警告をログに記録するかどうかを制御します。

内部実装

ngx_http_rewrite_module モジュールディレクティブは、設定段階で、リクエスト処理中に解釈される内部命令にコンパイルされます。インタープリターは、単純な仮想スタックマシンです。

たとえば、ディレクティブ

location /download/ {
    if ($forbidden) {
        return 403;
    }

    if ($slow) {
        limit_rate 10k;
    }

    rewrite ^/(download/.*)/media/(.*)\..*$ /$1/mp3/$2.mp3 break;
}

は、これらの命令に変換されます。

variable $forbidden
check against zero
    return 403
    end of code
variable $slow
check against zero
match of regular expression
copy "/"
copy $1
copy "/mp3/"
copy $2
copy ".mp3"
end of regular expression
end of code

上記の limit_rate ディレクティブの命令がないことに注意してください。これは、ngx_http_rewrite_module モジュールとは関係がないためです。 if ブロックには個別の設定が作成されます。条件が true の場合、リクエストには、limit_rate が 10k に等しいこの設定が割り当てられます。

ディレクティブ

rewrite ^/(download/.*)/media/(.*)\..*$ /$1/mp3/$2.mp3 break;

は、正規表現の最初のスラッシュをかっこ内に配置すると、命令を 1 つ減らすことができます。

rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break;

対応する命令は次のようになります。

match of regular expression
copy $1
copy "/mp3/"
copy $2
copy ".mp3"
end of regular expression
end of code