简明 Nginx Location Url 配置笔记
转载:https://www.jianshu.com/p/e154c2ef002f
1、匹配语法
nginx的url匹配模式很强大,同时使用非常灵活,尤其是优先级的匹配,如果不寻找规律,不但很难掌握,而且容易犯晕。了解优先级之前,先看看匹配的配置语法,以及都有那些匹配模式。
匹配的语法还是很简单的:
location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
实际写在loacation
中大概是这样的
location = / {
}
location [指令模式] url匹配模式 {
}
指令模式指用于匹配的方式,即精确匹配,前缀匹配还是正则匹配,当然这个是可选的,如果不写,则退化成正常匹配或者全匹配。url匹配模式则需要匹配的url,可以看成是web开发中的路由。下面就分别介绍指令模式和匹配模式。
2、精确匹配
=
指令用于精确字符匹配(模式),不能使用正则,区分大小写。为了直观的观察匹配命中的location,使用rewrite指令,用于转发。目前只要理解命中了就重定向到rewrite后面的url即可。
location = /demo {
proxy_pass http://google.com;
}
上述的配置表示只有访问
http://127.0.0.1/demo
这样的url,才能跳转到google的页面。除此之外的任何地址都无法访问,那怕是访问http://127.0.0.1/demo/
这个地址也不行。因为url匹配模式是/demo
。修改 location:
location = /demo$ {
proxy_pass http://google.com;
}
熟悉正则的同学初看会以为/demo$
表示demo
结尾的url,其实不然,这里的$
符号也是url的一部分,只有访问http://127.0.0.1/demo$
这个地址才能跳转。
3、前缀匹配
^~
指令用于字符前缀匹配,和=
精确匹配一样,也是用于字符确定的匹配,不能使用正则且区分大小写。和=
不同的在于,^~
指令下,访问的url无需和url匹配模式一模一样,只需要其开头前缀和url匹配模式一样即可。location ^~ /demo {
proxy_pass http://google.com;
}
对于该模式(/demo
),访问下列的地址都能匹配:
/demo
为前缀开头的url都能匹配。与该模式后的是否大小写无关。^~
不支持正则。模式/demo$
中的$
并不代表字符模式结束,而是一个是实实在在的$
,只有访问/demo$
开头的url才能匹配,http://127.0.0.1/demo
则不再匹配。
模式
/[0-9]emo
也不代表正则中的http://127.0.0.1/0emo
、http://127.0.0.1/5emo
之类,只有访问以 /[0-9]emo
开头url才行,例如http://127.0.0.1/[0-9]emo
或http://127.0.0.1/[0-9]emo/aaa
4、正则匹配
众所周知,nginx的url功能强大,配置灵活。字符匹配中,支持正则和不支持正则完全是两个境界。前面的两种方式都不能使用正则,未免让人觉得nginx有点虚夸。
实际上,nginx支持正则匹配。所使用的指令是~
和~*
,前者表示使用正则,区分大小写,后者表示使用正则,不区分大小写。与前缀匹配一样,正则匹配也是只需匹配以url模式开头的即可。location ~ /[0-9]emo {
proxy_pass http://google.com;
}
对于上述的模式,可以匹配的url如下:
/[0-9]emo
匹配的字符开头的url,都能匹配。使用~*
则不区分大小写
location ~ /[0-9]EmO {
proxy_pass http://google.com;
}