Nginx構成locationとrewriteルールチュートリアル

7837 ワード

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
  • は、正確な一致を=先頭で表す.ルートディレクトリの最後に一致するリクエストのみがAにある場合、後に文字列を付けることはできません.
  • ^~先頭はuriが通常の文字列で始まることを示し、正則一致
  • ではない.
  • ~先頭は大文字と小文字を区別する正則マッチング
  • を示す.
  • ~*先頭は大文字と小文字を区別しない正則マッチング
  • を示す.
  • /汎用照合、他の照合がない場合、要求は
  • に照合されます.
    順序&&優先度
    (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は他の機械に行きます.
    実行順序:
  • 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 ($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判定として使用できるグローバル変数を次に示します.
  • $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:
    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のマッチングを試み続けます