Nginx配置location
1.路径优先级
nginx配置的路由是由优先级顺序的。 (参考文章2)
(1) 匹配规则
1 | location [ = | ~ | ~* | ^~ ] uri { ... } |
语法规则很简单,一个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 | location ~* /api/ { |
“ ~ “匹配区分大小写,” ~* “匹配不区分大小写。
3.正则匹配示例二
需求:将 http://localhost/lsmfhx/api/getCofig
代理到 http://localhost:8080/lsmfhx_phemsjava/api/getConfig
。
解决方案:使用nginx中的$1、$2、$3,通过正则表达式的方式,就可以将全部的路由代理到相应的位置上去了。
1 | location ~* (.*)/api/(.*) { |
如果你要是在location正则中使用了相关的捕获,就要把相应的$1,$2都用上,如果不用,nginx就启动不了。比如
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进程,否则可能出现问题。
1.Websites show 502 Bad Gateway: no resolver defined to resolve example.com
2.Nginx解决“no resolver defined to resolve xxx.xxx”
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末尾带斜杠/和不带的区别 每次我都看这个,总是记不住,记住了可能就好了。