#昊鼎王五:nginx location正则表达式进阶写法

##示例及解析:

‘=’ 号 精确匹配 / ,主机名后面不能带任何字符串

location = / {
    [ configuration A ]
}

###匹配到所有请求 (因为所有的地址都以 / 开头,一般放在最末位置)

location / {
    [ configuration B ]
}

匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索

location /documents/ {       #只有后面的正则表达式没有匹配到时,这一条才会采用这一条
    [ configuration C ]
}

###匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索

location ~ /documents/Abc {    #只有后面的正则表达式没有匹配到时,这一条才会采用这一条
		[ configuration CC ]
}

###匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条。

location ^~ /images/ {
		[ configuration D ]
}

###匹配所有以 gif,jpg或jpeg 结尾的请求

location ~* \.(gif|jpg|jpeg)$ {     # 然而,所有请求 /images/ 下的图片会被 config D 处理,因为 ^~ 到达不了这一条正则
		[ configuration E ]
}

###字符匹配到 /images/,继续往下,会发现 ^~ 存在

location /images/ {
		[ configuration F ]
}

###最长字符匹配到 /images/abc,继续往下,会发现 ^~ 存在

location /images/abc {   # F与G的放置顺序是没有关系的
		[ configuration G ]
}

只有去掉 config D 才有效:先最长匹配 config G 开头的地址,继续往下搜索,匹配到这一条正则,采用

location ~ /images/abc/ {
		[ configuration H ]
}

###匹配多路径下js的请求

location ~* /js/.*/\.js{
		[ configuration I ]
}

###小结:

以=开头表示精确匹配,如 A 中只匹配根目录结尾的请求,后面不能带任何字符串。
	以 ^~ 开头表示uri以某个常规字符串开头,不是正则匹配
	以 ~ 开头表示区分大小写的正则匹配;
	以 ~* 开头表示不区分大小写的正则匹配
	以 / 通用匹配, 如果没有其它匹配,任何请求都会匹配到

###顺序 no优先级:
(location =) > (location 完整路径) > (location ^~ 路径) > (location ,* 正则顺序) > (location 部分起始路径) > (/)

###按照上面的location写法,以下的匹配示例成立:

/ -> config A         #精确完全匹配,即使/index.html也匹配不了
	 /downloads/download.html -> config B  #匹配B以后,往下没有任何匹配,采用B
	 /images/1.gif -> configuration D   #匹配到F,往下匹配到D,停止往下
	 /images/abc/def -> config D   #最长匹配到G,往下匹配D,停止往下,你可以看到 任何以/images/开头的都会匹配到D并停止,FG写在这里是没有任何意义的,H是永远轮不到的,这里只是为了说明匹配顺序
	 /documents/document.html -> config C  #匹配到C,往下没有任何匹配,采用C
	 /documents/1.jpg -> configuration E   #匹配到C,往下正则匹配到E
	 /documents/Abc.jpg -> config CC    #最长匹配到C,往下正则顺序匹配到CC,不会往下到E

###实际使用建议
所以实际使用中,个人觉得至少有三个匹配规则定义,如下:
####1.第一个必选规则是处理静态文件请求,这是nginx作为http服务器的强项

location ^~ /static/ {              								#目录匹配,任选其一
			root /webroot/static/;
}
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {           #后缀匹配,任选其一
			root /webroot/res/;
}

####2.第二个必选规则

location = / {
			proxy_pass http://tomcat:8080/index
}

####3.第三个规则就是通用规则,用来转发动态请求到后端应用服务器

location / {
			proxy_pass http://tomcat:8080/
}