Nginx是开源、高性能、高可靠的Web和反向代理服务器,而且支持热部署,几乎可以做到 7 * 24 小时不间断运行,即使运行几个月也不需要重新启动,还能在不间断服务的情况下对软件版本进行热更新。性能是Nginx最重要的考量,其占用内存少、并发能力强、能支持高达 5w 个并发连接数,最重要的是,Nginx是免费的并可以商业化,配置使用也比较简单。
nginx配置代理的时候往往会忽略一些关键的点,那么ocation匹配请求的 URL有“/”和无“/”有什么区别呢?这里给大家普及一下
一、location 配置
1,基本介绍
location 配置用于匹配请求的 URL,即 ngnix 中的 $request_uri 变量,其配置格式如下:
location [ 空格 | = | ~ | ~* |^~|!~ | !~* ] /uri/ {}
2,loacation 匹配顺序
(1)location 匹配格式规则前缀有如下几种:
- =开头:表示精确匹配
- ^~开头:注意这不是一个正则表达式,它的目的是优于正则表达式的匹配;如果该 location 是最佳匹配,则不再进行正则表达式检测。
- ~开头:表示区分大小写的正则匹配;
- ~*开头:表示不区分大小写的正则匹配
- !~ && !~*:表示区分大小写不匹配的正则和不区分大小写的不匹配的正则
(2)location 如果不带前缀就是普通字符串匹配,比如:
- /uri/ 普通字符串匹配
- / 绝对路径根目录匹配,如果没有其它匹配,任何请求都会匹配到
(3)匹配的搜索顺序优先级如下(从上到下优先级依次递减):
注意:
- 当有匹配成功时,立刻停止匹配,按照当前匹配规则处理请求
- 优先搜索并不意味着优先命中!
- 字符串匹配优先搜索,但是只是记录下最长的匹配 ( 如果 ^~ 是最长的匹配,则会直接命中,停止搜索正则 ),然后继续搜索正则匹配,如果有正则匹配,则命中正则匹配,如果没有正则匹配,则命中最长的字符串匹配。
- 首先匹配 =
- 其次匹配 ^~
- 再其次按照配置文件的顺序进行正则匹配
- 最后是交给 / 进行通用匹配
(location =) > (location 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 部分起始路径) > (/)
3,匹配模式及顺序举例
- location = /uri:= 开头表示精确匹配,只有完全匹配上才能生效。
- location ^~ /uri:^~ 开头对 URL 路径进行前缀匹配,并且在正则之前。
- location ~ :pattern~ 开头表示区分大小写的正则匹配。
- location ~* :pattern~* 开头表示不区分大小写的正则匹配。
- location /uri:不带任何修饰符,也表示前缀匹配,但是在正则匹配之后,如果没有正则命中,命中最长的规则。
- location /:通用匹配,任何未匹配到其它 location 的请求都会匹配到,相当于 switch 中的 default。
4,location 是否以“/”结尾
在 ngnix 中 location 进行的是模糊匹配
- 没有“/”结尾时,location/abc/def 可以匹配 /abc/defghi 请求,也可以匹配 /abc/def/ghi 等
- 而有“/”结尾时,location/abc/def/ 不能匹配 /abc/defghi 请求,只能匹配 /abc/def/anything 这样的请求
二、proxy_pass 代理规则(是否以“/”结尾)
(1)配置 proxy_pass 时,当在后面的 url 加上了 /,相当于是绝对路径,则 Nginx 不会把 location 中匹配的路径部分加入代理 uri。
比如下面配置,我们访问 http://IP/proxy/test.html,最终代理到 URL 是 http://127.0.0.1/test.html
(2)如果配置 proxy_pass 时,后面没有 /,Nginx 则会把匹配的路径部分加入代理 uri。
比如下面配置,我们访问 http://IP/proxy/test.html,最终代理到 URL 是 http://127.0.0.1/proxy/test.htm