在http模块中有server,在server模块才有location,location匹配的是uri
nginx中支持正则表达式
符号 | 作用 |
^ | 匹配输入字符串的起始位置 |
$ | 匹配输入字符串的结束位置 |
* | 匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll” |
+ | 匹配前面的字符一次或多次。如“ol+”能匹配“ol”及“oll”、“olll”,但不能匹配“o” |
? | 匹配前面的字符零次或一次,例如“do(es)?”能匹配“do”或者“does”,”?”等效于”{0,1}” |
. | 匹配除“\n”之外的任何单个字符,若要匹配包括“\n”在内的任意字符,请使用诸如“[.\n]”之类的模式 |
\ | 将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用。如“\n”匹配一个换行符,而“\$”则匹配“$” |
\d | 匹配纯数字[0-9] \s :空白符 \w :任意单词字符包括下划线[A-Za-z0-9_] |
{n} | 重复 n 次 |
{n,} | 重复 n 次或更多次 |
{n,m} | 重复 n 到 m 次 |
[ ] | 定义匹配的字符范围 |
[c] | 匹配单个字符 c |
[a-z] | 匹配 a-z 小写字母的任意一个 |
[a-zA-Z0-9] | 匹配所有大小写字母或数字 |
() | 表达式的开始和结束位置 |
| | 或运算符 |
location与rewrite的联系和区别
rewrite :对访问的域名或者域名内的URL路径地址重写
location:对访问的路径做访问控制或者代理转发
从功能看 rewrite 和 location 似乎有点像,都能实现跳转,主要区别在于 rewrite 是在同一域名内更改获取资源的路径,而 location 是对一类路径做控制访问或反向代理,还可以proxy_pass 到其他机器。
location匹配规则
location 大致可以分为三类:精准匹配" location = / {...} " ,一般匹配" location / {...} "和正则匹配" location ~ / {...} "。在nginx.conf的配置文件中location默认使用的是通用匹配 "location /{.....}"。
location匹配规则 | 规则作用 |
= | 进行普通字符精确匹配,也就是完全匹配。 |
^~ | 表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其它正则匹配的location。 |
~ | 区分大小写的正则匹配。 |
~* | 不区分大小写的正则匹配。 |
!~ | 区分大小写的正则匹配取非。 |
!~* | 不区分大小写的正则匹配取非。 |
location匹配示例说明
1.精确匹配
location = / {
root /vat/www/html
}
=为精确匹配 / ,主机名后面不能带任何字符串,例如想访问该location制定的匹配网页时,只能访问该主机IP或域名下的"/",而像"/abc,/data,/test"这一类和location等于号后面路径有任何一点差别的,都不会被匹配到。该匹配方式优先级最高,一旦匹配成功则立即采用。
比如:
location = /test {
root /var/www/html
}
所能匹配的只能是 www.abc.com/test
2.通用匹配
location / {
}
因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求.用户只要是能访问到该主机的IP或域名,即使不输入路径,也能匹配到相关的网页信息。(文件只要是存放在/var/www/html 中,或则更深的目录也能被匹配到。例如:/var/www/html/test/ 下存放网页,用户访问/test 也能够匹配访问到相关网页)该匹配方式为location匹配中优先级最低的方式,只有其他location匹配方式均为成功,才会采用该方式
3.一般匹配
第一种:
location /documents/ {
root /var/www/html
index index.html
}
第二种:
location /document/abc {
root /aaa/bbb/ccc
index index.html
}
匹配规则第一种:匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索其它 location只有其它 location后面的前缀路径没有匹配到时,才会采用这一条
匹配规则第二种:匹配任何以 /documents/abc 开头的地址,匹配符合以后。还要继续往下搜索其它 location只有其它 location后面的前缀路径没有匹配到时,才会采用这一条
location匹配规则:
location的匹配优先级:
精确匹配优先级最高---------->其次是正则匹配----------->一般匹配
location = 完整路径 > location ^~ > location~,~* > location /test > location /
在工作中配置location的原则:
1.网站首页:都是精确匹配(网站首页都是静态页面,匹配网站的根工作目录)
location = / {
}
2.处理静态文件的请求:目录请求匹配和后缀匹配
location ^~ /static {
}
location ~* \ . {html|jpg|images} ${
}
3.一般匹配:动态请求,把动态请求转发的后端
location / {
proxy_pass http://tomcat.server
}
4. 正则匹配与前缀^~匹配
#前缀^~匹配
location ^~ /images/ {
root /var/www/html
}
#正则匹配
location ~* \.(gif|jpg|jpeg)$ {
/var/www/html
}
location ^~ /images/ {}匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条
匹配所有以 gif、jpg或jpeg 结尾的请求。然而,所有请求 /images/ 下的图片会被 location ^~ /images/ 处理,因为 ^~ 的优先级更高,所以到达不了这一条正则
总结:^~ 前缀匹配是一种针对正则匹配的特殊的一般匹配方式 。前缀^~匹配在上面时:当访问的与前缀^~匹配相关时,就会停止正则匹配,采用该前缀匹配。正则匹配在上面时:当正则匹配匹配到请求时,还会继续查看其他的正则匹配。当遇到前缀^~匹配则会采用前缀匹配,而放弃该正则匹配。此外同是正则匹配的规则,看上下顺序决定优先级顺序
总结
优先级比较:
(location = 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 部分起始路径) > (location /)
location匹配优先级总结
精确匹配优先级最高---------->其次是正则匹配----------->一般匹配