Nginx構成locationとrewriteルールチュートリアル
7837 ワード
locationチュートリアル
例:は、正確な一致を=先頭で表す.ルートディレクトリの最後に一致するリクエストのみがAにある場合、後に文字列を付けることはできません. ^~先頭はuriが通常の文字列で始まることを示し、正則一致 ではない.~先頭は大文字と小文字を区別する正則マッチング を示す.~*先頭は大文字と小文字を区別しない正則マッチング を示す./汎用照合、他の照合がない場合、要求は に照合されます.
順序&&優先度
(location=)>(locationフルパス)>(location^~パス)>(location~,~*正規順)>(location部分開始パス)>(/)
実際の使用推奨事項
#次のように、少なくとも3つの一致ルール定義があります.
#Webサイトのルートに直接マッチングし、ドメイン名でWebサイトのトップページにアクセスすることが頻繁で、これを使用すると処理が加速します.
#バックエンドアプリケーションサーバに直接転送するか、静的トップページにすることもできます.
#最初の必須ルール
#2番目の必須ルールは、httpサーバの強みとしてnginxが使用する静的ファイル要求を処理することです.
#2つの構成モード、ディレクトリマッチングまたは接尾辞マッチングがあり、いずれかまたは組み合わせて使用します.
#3番目のルールは、動的リクエスト・チャネルのバックエンド・アプリケーション・サーバを転送するための汎用ルールです.
Rewriteチュートリアル
機能:nginxが提供するグローバル変数または自分で設定した変数を使用して、正規表現とフラグビットを組み合わせてurlの書き換えとリダイレクトを実現します.rewriteはserver{},location{},if{}にのみ配置でき、ドメイン名の後ろの伝達パラメータを除く文字列にのみ使用できます.たとえばhttp://seanlook.com/a/we/index.php?id=1&u=str/a/we/indexのみです.php書き換え
構文:rewrite regex replacement[flag];
ドメイン名またはパラメータ文字列を使用する場合は、グローバル変数マッチングを使用するかproxy_を使用します.pass逆エージェント.
rewriteとlocationの異同:同:いずれもジャンプを実現できる;異:rewriteは同じドメイン名でリソースを取得するパスを変更し、locationは別のパスに対して制御アクセスまたは逆プロキシを行い、proxy_passは他の機械に行きます.
実行順序: serverブロックのrewrite命令 locationマッチング locationのrewrite命令が選択され、あるステップurlが書き換えられた場合、書き換えサイクルは、本当に存在するファイルが見つかるまで1〜3実行される.ループが10回を超えると、500 Internal Server Errorエラー が返されます.
flagフラグビット last:Apacheに相当する[L]タグは、rewrite の完了を示す break:現在の仮想ホストの後続rewrite命令セット の実行を停止する redirect:302の一時的なリダイレクトを返し、アドレスバーにはジャンプ後のアドレス が表示されます. permanent:301の永続的なリダイレクトを返し、アドレスバーにはジャンプ後のアドレス が表示されます.
301と302は単純にステータスコードのみを返すことができず、リダイレクトのURLも必要であるため、return命令が301302を返すことができない理由である
lastとbreakの異同: lastは一般的にserverとifに書かれ、breakはlocationで に一般的に使用される. lastは、書き換え後のurlマッチングを終了しない.すなわち、新しいurlはserverからマッチングプロセスを再開し、breakは書き換え後のマッチング を終了する. breakおよびlastは、後続のrewrite命令 を実行し続けるように組織することができる.
if命令とグローバル変数
if判定命令
構文:if(condition){...}与えられた条件conditionを判断する.真の場合、カッコ内のrewrite命令が実行され、if条件(condition)は以下のいずれかであってもよい.
式が変数である場合、値が空または0で始まる文字列はfalseとして扱われます.
変数と内容を直接比較するには、=または!=を使用します.
~正規表現マッチング、~*大文字と小文字を区別しないマッチング、!~大文字と小文字を区別する不一致-fと!fファイル が存在するか否かを判断するために用いる.-dと!dディレクトリ が存在するか否かを判断するために用いる.-eと!eファイルまたはディレクトリ が存在するか否かを判断するために用いる.-xと!xファイルが を実行できるか否かを判断するために用いる.
例:
グローバル変数
if判定として使用できるグローバル変数を次に示します.$args:この変数は要求行のパラメータに等しく、$query_と同じです.string $content_length:要求ヘッダのConten-lengthフィールド $content_type:リクエストヘッダのContent-Typeフィールド $document_root:root命令で指定された値 を要求する$host:ホストヘッダフィールドを要求します.そうでなければ、サーバ名 です. $http_user_Agent:クライアントagent情報 $http_Cookie:クライアントcookie情報 $limit_rate:接続速度の制限 $request_method:クライアント要求の動作、通常GETまたはPOST $remote_addr:クライアントのIPアドレス $remote_port:クライアントのポート $remote_user:Auth Basic Moduleによって検証されたユーザー名 $request_filename:rootまたはalias命令とURL要求によって を生成する現在要求されているファイルパス$scheme:HTTPメソッド(http,httpsなど) $server_protocol:使用を要求するプロトコル、通常HTTP/1.0またはHTTP/1.1 $server_addr:サーバアドレス、システム呼び出しが完了すると、この値 を決定できます. $server_name:サーバ名 $server_port:要求到着サーバのポート番号 $request_url:要求パラメータを含む元のurl、「/foo/bar.php?arg=baz」などのホスト名を含まない $url:要求パラメータを持たない現在のurl、$urlにはホスト名が含まれません.たとえば「/foo/bar.html」 $document_url:$urlと同じ 例:http://localhost:88/test1/test2/test.php
$host:localhost
$server_port:88
$request_url:http://localhost:88/test1/test2/test.php
$document_url:/test1/test2/test.php
$document_root:/var/www/html
$request_filename:/var/www/html/test1/test2/test.php
常用正則 .:改行文字以外の任意の文字に一致する ?:0回または1回の繰り返し +:1回以上 を繰り返します.*:1回以上 を繰り返します.d:一致数 ^:一致文字列の開始 $:一致する文字の末尾 {n}: をn回繰り返す{n,}:n回以上 を繰り返す[c]:単一文字c に一致する[a-z]:a-z小文字の任意の括弧()間で一致する内容に一致し、後に$1で参照することができ、$2は前の2番目の()の内容を表す.正則で困惑しがちなのは、エスケープ特殊文字 rewriteインスタンス
例1:
例えば/images/ef/uh 7 b 3/test.pngのリクエストは、/dataに書き換えますか?file=test.png、location/dataに一致し、/data/images/testを先に見る.pngファイルは存在せず、存在する場合は正常応答し、存在しない場合はtryfilesを新しいimage 404 locationに書き換え、404ステータスコードに直接戻る.
例2:
対形如/images/bla_500x400.jpgのファイルリクエスト、/resizer/blaに書き換えるjpg?width=500&height=400アドレスで、locationのマッチングを試み続けます
例:
location = / {
# /,
[ configuration A ]
}
location / {
# / ,
#
[ configuration B ]
}
location /documents/ {
# /documents/ , ,
# ,
[ configuration C ]
}
location ~ /documents/Abc {
# /documents/ , ,
# ,
[ configuration CC ]
}
location ^~ /images/ {
# /images/ , , ,
[ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {
# gif,jpg jpeg
# , /images/ config D , ^~
[ configuration E ]
}
location /images/ {
# /images/, , ^~
[ configuration F ]
}
location /images/abc {
# /images/abc, , ^~
# F G
[ configuration G ]
}
location ~ /images/abc/ {
# config D : config G , , ,
[ configuration H ]
}
location ~* /js/.*/\.js
順序&&優先度
(location=)>(locationフルパス)>(location^~パス)>(location~,~*正規順)>(location部分開始パス)>(/)
実際の使用推奨事項
#次のように、少なくとも3つの一致ルール定義があります.
#Webサイトのルートに直接マッチングし、ドメイン名でWebサイトのトップページにアクセスすることが頻繁で、これを使用すると処理が加速します.
#バックエンドアプリケーションサーバに直接転送するか、静的トップページにすることもできます.
#最初の必須ルール
location = / {
proxy_pass http://tomcat:8080/index
}
#2番目の必須ルールは、httpサーバの強みとしてnginxが使用する静的ファイル要求を処理することです.
#2つの構成モード、ディレクトリマッチングまたは接尾辞マッチングがあり、いずれかまたは組み合わせて使用します.
location ^~ /static/ {
root /webroot/static/;
}
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
root /webroot/res/;
}
#3番目のルールは、動的リクエスト・チャネルのバックエンド・アプリケーション・サーバを転送するための汎用ルールです.
location / {
proxy_pass http://tomcat:8080/
}
Rewriteチュートリアル
機能:nginxが提供するグローバル変数または自分で設定した変数を使用して、正規表現とフラグビットを組み合わせてurlの書き換えとリダイレクトを実現します.rewriteはserver{},location{},if{}にのみ配置でき、ドメイン名の後ろの伝達パラメータを除く文字列にのみ使用できます.たとえばhttp://seanlook.com/a/we/index.php?id=1&u=str/a/we/indexのみです.php書き換え
構文:rewrite regex replacement[flag];
ドメイン名またはパラメータ文字列を使用する場合は、グローバル変数マッチングを使用するかproxy_を使用します.pass逆エージェント.
rewriteとlocationの異同:同:いずれもジャンプを実現できる;異:rewriteは同じドメイン名でリソースを取得するパスを変更し、locationは別のパスに対して制御アクセスまたは逆プロキシを行い、proxy_passは他の機械に行きます.
実行順序:
flagフラグビット
301と302は単純にステータスコードのみを返すことができず、リダイレクトのURLも必要であるため、return命令が301302を返すことができない理由である
lastとbreakの異同:
if命令とグローバル変数
if判定命令
構文:if(condition){...}与えられた条件conditionを判断する.真の場合、カッコ内のrewrite命令が実行され、if条件(condition)は以下のいずれかであってもよい.
式が変数である場合、値が空または0で始まる文字列はfalseとして扱われます.
変数と内容を直接比較するには、=または!=を使用します.
~正規表現マッチング、~*大文字と小文字を区別しないマッチング、!~大文字と小文字を区別する不一致
例:
if ($http_user_agent ~ MSIE) {
rewrite ^(.*)$ /msie/$1 break;
} # UA ”MSIE“,rewrite /msie/
if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
set $id $1;
} # cookie , $id
if ($request_method =POST) {
return 405;
} # POST, 405(Method not allowed)。return 301,302
if ($slow) {
limit_rate 10k;
} # ,$slow set
if (!-f $request_filename){
break;
proxy_pass http://127.0.01;
} # , localhost。 break rewrite
if ($args ~ post=140){
rewrite ^ http://example.com/ permanent;
} # query string ”post=140“, example.com
location ~* \.(gif|jpg|png|swf|flv)$ {
valid_referers none blocked www.jefflei.com www.leizhenfang.com;
if ($invalid_referer) {
return 404;
} #
}
グローバル変数
if判定として使用できるグローバル変数を次に示します.
$host:localhost
$server_port:88
$request_url:http://localhost:88/test1/test2/test.php
$document_url:/test1/test2/test.php
$document_root:/var/www/html
$request_filename:/var/www/html/test1/test2/test.php
常用正則
例1:
http {
# image
log_format imagelog '[$time_local] ' $image_file ' ' $image_type ' ' $body_bytes_sent ' ' $status;
#
rewrite_log on;
server {
root /home/www;
location / {
#
error_log logs/rewrite.log notice;
# '' , {}
rewrite '^/images/([a-z]{2})/([a-z0-9]{5})/(.*)\.(png|jpg|gif)$' /data?file=$3.$4;
# ”last“ , set
set $image_file $3;
set $image_type $4;
}
location /data {
# ,
access_log logs/images.log main;
root /data/images;
# 。 , , url
try_files /$arg_file /image404.html;
}
location = /image404.html {
#
return 404 "image not found
";
}
}
例えば/images/ef/uh 7 b 3/test.pngのリクエストは、/dataに書き換えますか?file=test.png、location/dataに一致し、/data/images/testを先に見る.pngファイルは存在せず、存在する場合は正常応答し、存在しない場合はtryfilesを新しいimage 404 locationに書き換え、404ステータスコードに直接戻る.
例2:
rewrite ^/images/(.*)_(\d+)x(\d+)\.(png|jpg|gif)$ /resizer/$1.$4?width=$2&height=$3? last;
対形如/images/bla_500x400.jpgのファイルリクエスト、/resizer/blaに書き換えるjpg?width=500&height=400アドレスで、locationのマッチングを試み続けます