nginxlocation可以根据字符串或者正则表达式来进行匹配如果要使用正则表达式,则必须以“~”或者~*开头~表示区分大小写~*表示不区分大小写匹配过程如下:第一步:进行字符串匹配,找到最合适的那一个第二步:进行正则表达式匹配,找到匹配上的第
nginx location可以根据字符串或者正则表达式来进行匹配
如果要使用正则表达式,则必须以“~”或者"~*"开头
"~"表示区分大小写
"~*"表示不区分大小写
匹配过程如下:
第一步:进行字符串匹配,找到最合适的那一个
第二步:进行正则表达式匹配,找到匹配上的第一个
第三步:如果第二步匹配上了,则用第二步匹配的结果,否则用第一步匹配的结果
从上面可以看出来,正则表达式的优先级要高一些
上面的匹配过程的例外:
1.可以用"="加在字符串前面,表示完全匹配,如果过来的url与某个字符串完全匹配(前面有"="),则搜索停止。因此经常访问"/",则用"=/"可以加快一点点处理速度(因为它停止了nginx配置中的其他搜索)
2.如果只想用字符串匹配,则在字符串前加“^~”,则一旦字符串匹配上了,就不会再进行正则表达式匹配
综上,location的匹配规则如下:
1.先进行"="的完全匹配,如果匹配上,则搜索停止
2.进行字符串匹配,如果匹配上了,但是没有"^~",则进行第3步;如果匹配上了,而且有"^~",则搜索停止;
3.正则表达式匹配,如果匹配上了,则搜索停止;如果没有匹配上,则进行第4步;
4.此时第3步没有匹配上,则拿第2步匹配的结果来进行,如果第2步也没有匹配上,则跳到错误页面(404)
location = / {
# 只匹配"/"
[ configuration A ]
}
location / {
# 匹配一切以"/"为开头的查询,但是正则表达式(优先级更高),和
# 更长的字符串匹配(更切合查询)将优先匹配
[ configuration B ]
}
location ^~ /images/ {
# 匹配以"/images/"开头的查询,因为有"^~",将不会搜索正则表达式
[ configuration C ]
}
location ~* \.(gif|jpg|jpeg)$ {
# 匹配一切以".gif .jpg
.jpeg"为结尾的查询,然后如果查询以"/images/"开头,
# 以“.gif .jpg .jpeg”结尾,还是会匹配 configuration
C
[ configuration D ]
举例查询
/ -> configuration A
/documents/document.html -> configuration B
/images/1.gif -> configuration C
/documents/1.jpg -> configuration D
--------------------------------------------------------------------------------------------------------------------------------
实际测试,下面为一个完整的nginx域名配置,使用return来进行区分匹配上哪个location
server{
listen 80;
server_name want.abc.com;
charset gbk;
access_log logs/want_access.log
main;
error_log logs/want_error.log;
location = / { return 100;}
location / { return 101;}
location ~ /images/ { return 102;}
location ^~ /images/ { return 103;}
location ~* \.(gif|jpg|jpeg)$ {return 105;
}
location /a {return 106;}
location ~ /a { return 107; }
}
解释:先进行"="的完全匹配,如果匹配上,则搜索停止
~# wget want.abc.com/
--2012-01-05 16:09:23-- http://want.abc.com/
正在解析主机 want.abc.com... 127.0.0.1
正在连接 want.abc.com|127.0.0.1|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 100
2012-01-05 16:09:23 错误 100:(没有描述)。
解释:正则表达式没有匹配上,就是用字符串匹配
# wget want.abc.com/document/document.html
--2012-01-05 16:12:03--
http://want.abc.com/document/document.html
正在解析主机 want.abc.com... 127.0.0.1
正在连接 want.abc.com|127.0.0.1|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 101
2012-01-05 16:12:03 错误 101:(没有描述)。
解释:进行字符串匹配,匹配上了,同时有"^~",则停止搜索
#wget want.abc.com/images/a
--2012-01-05 16:12:25-- http://want.abc.com/images/a
正在解析主机 want.abc.com... 127.0.0.1
正在连接 want.abc.com|127.0.0.1|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 103
2012-01-05 16:12:25 错误 103:(没有描述)。
解释:正则表达式匹配上了,停止搜索
# wget want.abc.com/abc/1.gif
--2012-01-05 16:14:23-- http://want.abc.com/abc/1.gif
正在解析主机 want.abc.com... 127.0.0.1
正在连接 want.abc.com|127.0.0.1|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 105
2012-01-05 16:14:23 错误 105:(没有描述)。
解释:字符串匹配上了,正则表达式匹配上了,但是优先使用正则表达式匹配
# wget want.abc.com/a
--2012-01-05 16:18:15-- http://want.abc.com/a
正在解析主机 want.abc.com... 127.0.0.1
正在连接 want.abc.com|127.0.0.1|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 107
2012-01-05 16:18:15 错误 107:(没有描述)。