xylz,imxylz

关注后端架构、中间件、分布式和并发编程

   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  111 随笔 :: 10 文章 :: 2680 评论 :: 0 Trackbacks

Nginx 中的地址(location)

语法: location [=|~|~*|^~|@] /uri/ { ... }

默认值: no

上下文: server

location可以配置依赖于URI的请求,根据不同的规则将请求转发到相应的后端服务器上。location的path规则支持正则表达式。 为了使用正则表达式,必须使用下面的匹配符:

  • ~* 不区分大小写的正则表达式
  • ~ 区分大小写的正则表达式

匹配的规则是优先使用常量字符串(非正则表达式),如果任何一个常量字符串匹配就停止匹配,返回匹配的结果。如果常量字符串不匹配就匹配正则表达式,找到第一个匹配的正则表达式规则就停止匹配,返回匹配的结果。如果正则表达式也不匹配就匹配URL的PATH(一级一级往上匹配,最终到/)。

"="仅仅匹配URI完全一样的地址。显然正则表达式的匹配速度是慢于字符串的直接匹配的,所以如果一个地址是频繁访问的话,使用"="可以提高匹配的速度。

任何一条不使用 "=" 或者 "^~" 前缀的常量字符串规则匹配就立即停止终止匹配。 小结,匹配规则如下:

  1. 匹配"="的规则,如果完全匹配,终止匹配。
  2. 匹配普通字符串,如果匹配带有"^~"前缀的,终止匹配。
  3. 匹配正则表达式,匹配的顺序按照配置文件中的定义顺序。
  4. 如果规则3匹配一个结果就终止匹配,否则使用规则2中的结果。

特别强调的是,nginx不匹配编码后的字符串,比如"/images/%20/test"中带有一个空格,那么必须使用"/images/ /test"才能匹配,而不是使用编码后的字符。

下面是一个例子。

location  = / {
#仅仅匹配地址"/"
[规则A]
}
location  / {
# 匹配任何一个以"/"开头的地址,所以说基本上匹配所有地址,但是正则表达式可能优先于此匹配。
[规则B]
}
location ^~ /images/ {
# 匹配任何以"/images"开头的地址,此匹配规则要优先于正则表达式。
[规则C]
}
location ~* \.(gif|jpg|jpeg)$ {
# 匹配任何以"gif", "jpg", 或者".jpeg"结尾的地址。但是"/images/"目录中的文件会被规则C优先匹配。
[规则D]
}

例如下面一些请求:

/ -> 规则A
/documents/document.html -> 规则B
/images/1.gif -> 规则C
/documents/1.jpg -> 规则D

四种规则可以以任何顺序在配置文件中定义,同一条规则多条正则表达式匹配时,依赖其在配置文件中的顺序。另外,嵌套的location可能导致未知的匹配结果。

另外,前缀"@" 比较特别,用来处理错误页面尝试页面(多页面时顺序匹配规则)。



©2009-2014 IMXYLZ |求贤若渴
posted on 2010-01-29 16:05 imxylz 阅读(21885) 评论(0)  编辑  收藏 所属分类: nginx

只有注册用户登录后才能发表评论。


网站导航:
 

©2009-2014 IMXYLZ