Nginx配置location

标签: Nginx 分类: 后台服务 创建时间:2020-05-14 07:59:53 更新时间:2023-10-20 11:23:26

1.路径优先级

nginx配置的路由是由优先级顺序的。 (参考文章2)
(1) 匹配规则

1
2
location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }

语法规则很简单,一个location关键字,后面跟着可选的修饰符,后面是要匹配的字符,花括号中是要执行的操作。

  • = 表示精确匹配。只有请求的url路径与后面的字符串完全相等时,才会命中。
  • ~ 表示该规则是使用正则定义的,区分大小写。
  • ~* 表示该规则是使用正则定义的,不区分大小写。
  • ^~ 表示如果该符号后面的字符是最佳匹配,采用该规则,不再进行后续的查找。

(2) 匹配过程
对请求的url序列化。例如,对%xx等字符进行解码,去除url中多个相连的/,解析url中的.,..等。这一步是匹配的前置工作。
location有两种表示形式,一种是使用前缀字符,一种是使用正则。如果是正则的话,前面有*修饰符。

具体的匹配过程如下:
(1) 首先先检查使用前缀字符定义的location,选择最长匹配的项并记录下来。
(2) 如果找到了精确匹配的location,也就是使用了=修饰符的location,结束查找,使用它的配置。
(3) 然后按顺序查找使用正则定义的location,如果匹配则停止查找,使用它定义的配置。
(4) 如果没有匹配的正则location,则使用前面记录的最长匹配前缀字符location。

2.正则匹配示例

将所有的带api的都转发到tomcat上。比如:请求:http://localhost/lsmfhx_phemsjava/api/getConfig,所有包含api的,都转到内部的8080服务器上。可以使用locaiton的正则匹配*、表达式

1
2
3
location ~* /api/ {
proxy_pass http://localhost:8080;
}

“ ~ “匹配区分大小写,” ~* “匹配不区分大小写。

3.正则匹配示例二

需求:将 http://localhost/lsmfhx/api/getCofig 代理到 http://localhost:8080/lsmfhx_phemsjava/api/getConfig

解决方案:使用nginx中的$1、$2、$3,通过正则表达式的方式,就可以将全部的路由代理到相应的位置上去了。

1
2
3
4
location ~* (.*)/api/(.*) {
proxy_pass http://localhost:8080/$1_phemsjava/api/$2;
}

如果你要是在location正则中使用了相关的捕获,就要把相应的$1,$2都用上,如果不用,nginx就启动不了。比如

1
2
3
4
5
6
7
8
9
## 错误的配置
location ~ /(.*)/phemsjava {
proxy_pass http://localhost:7000/;
}

## 正确的配置
location ~ /(.*)/phemsjava {
proxy_pass http://localhost:7000/$1;
}

我尝试过参考文章1中的方法,使用代斜杠或者不带斜杠的方式:

在nginx中配置proxy_pass代理转发时,如果在proxy_pass后面的url加/,表示绝对根路径,匹配到的路径不会代理走;如果没有/,表示相对路径,把匹配的路径部分也给代理走。

加上了斜杠,和不加斜杠,都无法满足我的需求,最后都会把匹配到的路由加到后面,可能还需要进一步的测试。

参考文章:
1.nginx 之 proxy_pass详解
2.nginx正则相关变量$1,$2,$3使用注意
3.“proxy_pass” cannot have URI part in location given by regular expression 当配置错误的时候,会出现nginx无法启动的情况
4.Nginx正则配置 各种正则的匹配方式及优先级

问题

1.no resolver defined to resolve localhost, client: 127.0.0.1, server: localhost

在http节点添加resolver 127.0.0.1; 然后重启nginx,在windos下要使用:taskkill /f /im nginx.exe 杀死所有的nginx进程,否则可能出现问题。

4.location和proxy_pass的斜杠

还有在参考文章1中,有这样的说法,我觉得总结的挺好:

加不加的斜杠,这里说的我觉得挺好的。在location中匹配的url最后有无/结尾,指的是模糊匹配与精确匹配的问题,location只判断是模糊匹配还是精确匹配。没有"/"结尾时是模糊匹配,有"/"结尾时是精确匹配。在proxy_pass中代理的url最后有无/结尾,指的是在proxy_pass 指定的url后要不要加上location匹配的url的问题,加上斜杠,就是不加location匹配到的内容,如果不加斜杠,就是要加上location的匹配到的内容。

Nginx的官网将proxy_pass分为两种类型:一种是只包含IP和端口号的(连端口之后的/也没有,这里要特别注意),比如proxy_pass http://localhost:8080,这种方式称为不带URI方式;另一种是在端口号之后有其他路径的,包含了只有单个/的如proxy_pass http://localhost:8080/,以及其他路径,比如proxy_pass http://localhost:8080/abc

(1) 对于不带URI方式,nginx将会保留location中路径部分
(2) 对于带URI方式,nginx将使用诸如alias的替换方式对URL进行替换,并且这种替换只是字面上的替换

如果proxy_pass末尾有斜杠/,proxy_pass不拼接location的路径
如果proxy_pass末尾无斜杠/,proxy_pass会拼接location的路径

参考文章:
1.nginx的url匹配,location和proxy_pass以/结尾的问题
2.Nginx中proxy_pass的斜杠问题 这里也可以,有不同的配置方式。
3.Windows下Nginx的启动、停止、重启等命令
4.nginx的location和proxy_pass是否带斜杠的区别 nginx中最后带斜杠和不带斜杠的区别
5.Nginx中location、proxy_pass后方加不加斜杠/的区别 只要是proxy_pass 端口后方加了斜杠的那么 location都会被替换不会加到实际访问路径中
6.Nginx中proxy_pass末尾带斜杠/和不带的区别 每次我都看这个,总是记不住,记住了可能就好了。
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。