3分でnginxのlocationディレクティブを理解する

1。概要

location命令はnginx最も重要な命令の1つです。命令locationの機能は、さまざまなurl要求を照合し、要求に対して異なる方法で処理および応答することです。理解しにくいのは、複数のlocation照合シーケンスです。この記事では、説明に焦点を当てます。そして説明。

nginxリクエストURI場所で設定されたURI一致させます

2.ロケーションフォーマット

location2つの形式があります:

  • 一致するuriパラメータには4つのタイプがあります。もちろん、パラメータを取得することもできません。
  • 定義ブロックと同様に、識別されたものをlocation使用した命名@goto

location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }

3.ロケーションマッチングパラメータの説明

パラメータ 説明
空気 location直後に続くパラメーターはありませんURI。これは、プレフィックスが一致することを意味しURIます。つまり、最初から要求に一致することを意味します。
大文字と小文字を区別して、定期的に一致させます。
〜* 大文字と小文字を区別せずに、定期的に一致させます。
^〜 一般的な文字照合は、主にディレクトリの照合に使用されます。
= 通常の文字と完全に一致させます。
@ 「@」は名前付きlocationlocaiton名前を定義error_pagetry_filesます。@定義された名前は、通常コマンドなどの内部方向付けに使用さます。その機能はプログラミングの機能と似ていますgoto

4.ロケーションマッチングの順序

nginxリクエストに一致する命令には2つのレベルがありますURI=>

最初のレベルがあるserverことによる命令域名ipおよび端口一致が見つかった最初のレベルの試合、やるserver入力した後に試合を。の照合は、構成ファイルに表示される順序に正確に基づいているわけではありません。要求次のルールの構成と照合されますserverlocationlocationURIserverlocation

  1. “=”符号パラメータlocationに完全に一致するかどうかを探し、等符号に完全に一致する場合は、一致をlocation停止し、その中のlocation命令を実行し、他のタイプと一致しないでくださいlocation
  2. 全て非マッチング正規表現URIlocation(を含む=^~パラメータの三種類)。最長のリクエストURI見つけてlocation URIプレフィックス照合しますlocation。最長のlocationパラメータがの場合^~、照合を停止locationしてその中の命令を実行locationます。それ以外の場合は、一時的に保存します。
  3. 正規表現一致URIlocation(など~~*によると、2種類のパラメータが)location、それは最初の一致検出された場合、それらが、コンフィギュレーションファイルマッチングに表示される順序locaiton一致が、実行を停止しますlocation
  4. 照合後にすべての正規式が照合されない場合location、2番目のステップで一時的に保存された最長のプレフィックス照合が実行されlocationます。

4.1マッチング順序の調整

このルールに従って簡単に言えば:
=> ~^> ~= ~*> 最长前缀匹配>/

5.疑問符の後のパラメーターを一致させます

URI後者が問題ではないことを要求locationするこれらのパラメータに一致するマークパラメータ$query_string変数に格納されif決定することができます。

たとえば'パラメータを一重引用符で照合してから、エラーページにリダイレクトします。

/plus/list.php?tid=19&mid=1124'

if ( $query_string ~* ".*[;'<>].*" ){
    
    
  return 404;
}

6.ロケーションURIの有無にかかわらず/

これについての多くの説明は正確ではなく、もう少し言葉を言う必要があります。

URI最後にリクエストがあるかどうかは/、バンド/がアクセスディレクトリを/示し、不在がアクセスファイルを示すという一般的な処理ロジックです。ファイルが存在しない場合は、ディレクトリが照合されます。たとえば、アクセスhttp://www.nginx.cn/images/とのhttp://www.nginx.cn/images場合、前のリクエストはディレクトリに一致し、後続のリクエストは最初にファイルに一致し、ファイルが保存されていない場合はディレクトリが一致します

場合で終わり、そして実行することが不可欠である1。locatioinURIURI/locationproxy_passfastcgi_passuwsgi_passscgi_passmemcached_passgrpc_pass

例えば:

location  /images/ {
    
    
  proxy_pass http://www.redis.com.cn
}

この場合、指定されたファイルまたはディレクトリが存在するnginxかどうかに関係なく特別な処理が行われimagesます。アクセスすると、そこhttp://www.nginx.cn/imagesにリダイレクトされますhttp://www.nginx.cn/images/

したがって、これら2つの要求を異なる処理に対応させる場合は/終了せずにlocation構成を明示的に追加する必要があります。

location  /images {
    
    
  proxy_pass http://www.rabbitmq.cn
}
location  /images/ {
    
    
  proxy_pass http://www.redis.com.cn
}

7.場所に名前を付ける

with"@"、リクエストの一致に関係しないlocationネーミングを定義するために使用されますlocation。これlocationは通常、内部の向きで使用されます。

使用例error_pagetry_filesは、コマンド。

その機能はプログラミングの機能と似ていますgoto

location  /images {
    
    
  try_files $uri $uri/ @name;
}
location  @name {
    
    
  ...
}

8.ケース

location  = / {
    
    
  // 只匹配请求 "/"
  [ configuration A ] 
}
location  / {
    
    
  // 匹配任何请求,因为所有请求都是以"/"开始
  // 但是更长字符匹配或者正则表达式匹配会优先匹配
  [ configuration B ] 
}
location /documents/ {
    
    
  // 匹配所有 /documents/ 开头的请求,在没有正则表达式匹配时选择该locaiton
  [ configuration C ]
}
location ^~ /images/ {
    
    
  // 匹配任何以 /images/ 开始的请求,并停止匹配其它location
  [ configuration D ] 
}
location ~* .(gif|jpg|jpeg)$ {
    
    
  // 匹配以 gif, jpg, or jpeg结尾的请求. 
  // 但是所有 /images/ 目录的请求将由 [Configuration D]处理.   
  [ configuration E ] 
}

リクエストのURI例:

  1. /->一致A
  2. /index.html->一致B
  3. /documents/a.html ->一致C
  4. /images/1.gif ->一致D
  5. /documents/1.jpg ->一致E


(後で追加されます)

おすすめ

転載: blog.csdn.net/u013946061/article/details/107738317