nginx使用location指令去匹配不同的路径
nginx首先通过路径的前缀去匹配
此时用法就是如下:
# url就是路径的前缀,比如/, 比如/aaa
location url {...}
- 1
- 2
location / {
config1
}
location /aaa {
config2
}
location /aaa/bbb {
config3
}
像上面这个例子
如果访问的路径是/ewrs, 那么config1会被使用
如果访问的路径以/aaa开头, 例如/aaa/sdewr, 那么config2会被使用
如果访问的路径以/aaa/bbb开头,例如/aaa/bbb/sdfjkw, 那么config3会被使用
也就是nginx最终匹配到满足条件的最长的路径前缀
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
nginx还可以通过正则表达式去匹配路径
此时用法就是如下:
# 不区分大小写的正则
location *~ {...}
# 区分大小写的正则
location ~ {...}
- 1
- 2
- 3
- 4
location ~* \.(gif|jpg)$ {
config2
}
上面这个例子
如果访问的路径/aaa/1.gif,
那么config2就会被使用
- 1
- 2
- 3
- 4
- 5
- 6
- 7
nginx配置中存在多个满足条件的正则location,那么只有第一个会被匹配到
nginx配置中有多个使用正则匹配的location指令的时候,nginx按照这些location指令在配置文件中出现的顺序去匹配,只要有一个匹配到,就会终止匹配,直接使用这个匹配到location配置,比如:
# 以/user开头的路径
location *~ ^(/user) {
config1
}
# 任意的路径
location *~ .+ {
config2
}
上面的例子
如果要访问的路径是/user, 那么匹配到的就是config1了
如果要访问的路径是/aaa, 那么匹配到的就是config2了
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
nginx配置中同时存在使用路径前缀的和使用正则的location指令
有时候,nginx中有一个location指令使用路径前缀去匹配,另外一个location指令使用正则去匹配,而且要访问的路径也都满足了这两个location指令的条件,比如:
# 以/aaa开头的路径
location /aaa {
config1
}
# 以.gif或者.jpg结尾的路径
location ~* \.(gif|jpg)$ {
config2
}
上面的例子,
如果访问的路径是/aaa/1.jpg,
那么先是匹配到config1,然后config2也被匹配到了,
但是会采用config2
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
nginx首先会使用路径前缀匹配一遍,找到长度最大的一个,
然后再去进行正则匹配,找到第一个满足条件的正则,
然后优先使用正则location指令对应的配置。
要避免这种情况,
就可以在路径前缀前面加上修饰符^~,
这样就会采用路径前缀对应的配置了,
不会去继续进行正则匹配了,例如:
# 以/aaa开头的路径
location ^~ /aaa {
config1
}
# 以.gif或者.jpg结尾的路径
location ~* \.(gif|jpg)$ {
config2
}
上面的例子,
如果访问的路径是/aaa/1.jpg,
那么先是匹配到config1,然后停止进一步的匹配了
此时会采用config1
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
nginx也可以精确匹配某一个路径
# 路径为/aaa
location = /aaa {
config1
}
# 以/aaa开头的路径
location /aaa{
config2
}
上面的例子,
如果访问的路径是/aaa,那么config1会被匹配到,
如果访问的路径是/aaa/bbb, 那么config2会被匹配到
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12