location目录匹配详解
nginx每个location都是一个匹配目录,nginx的策略是:访问请求来时,会对访问地址进行解析,从上到下逐个匹配,匹配上就执行对应location大括号中的策略,并根据策略对请求作出相应。
依访问地址:http://www.wandouduoduo.com/wddd/index.html为例,nginx配置如下:
1 location /wddd/ { 2 proxy_connect_timeout 18000; ##修改成半个小时 3 proxy_send_timeout 18000; 4 proxy_read_timeout 18000; 5 proxy_pass http://127.0.0.1:8080; 6 }
那访问时就会匹配这个location,从而把请求代理转发到本机的8080端口的Tomcat服务中,Tomcat响应后,信息原路返回。总结:location如果没有“/”时,请求就可以模糊匹配以字符串开头的所有字符串,而有“/”时,只能精确匹配字符本身。
下面举个例子说明:
配置 location /wandou 可以匹配 /wandoudouduo 请求,也可以匹配 /wandou*/duoduo 等等,只要以 wandou 开头的目录都可以匹配到。而 location /wandou/ 必须精确匹配 /wandou/ 这个目录的请求, 不能匹配 /wandouduoduo/ 或 /wandou*/duoduo 等请求。
proxy_pass有无“/”的四种区别探究
访问地址都是以:http://www.wandouduoduo.com/wddd/index.html 为例。请求都匹配目录/wddd/
第一种:加"/"
1 location /wddd/ { 2 proxy_pass http://127.0.0.1:8080/; 3 }
测试结果,请求被代理跳转到:http://127.0.0.1:8080/index.html
第二种: 不加"/"
1 location /wddd/ { 2 proxy_pass http://127.0.0.1:8080; 3 }
测试结果,请求被代理跳转到:http://127.0.0.1:8080/wddd/index.html
第三种: 增加目录加"/"
1 location /wddd/ { 2 proxy_pass http://127.0.0.1:8080/sun/; 3 }
测试结果,请求被代理跳转到:http://127.0.0.1:8080/sun/index.html
第四种:增加目录不加"/"
1 location /wddd/ { 2 proxy_pass http://127.0.0.1:8080/sun; 3 }
测试结果,请求被代理跳转到:http://127.0.0.1:8080/sunindex.html
总结
location目录后加 "/", 只能匹配目录,不加 “/” 不仅可以匹配目录还对目录进行模糊匹配。而proxy_pass无论加不加“/”,代理跳转地址都直接拼接。
为了加深大家印象可以用下面的配置实验测试下:
1 server { 2 listen 80; 3 server_name localhost; 4 5 # http://localhost/wddd01/xxx -> http://localhost:8080/wddd01/xxx 6 location /wddd01/ { 7 proxy_pass http://localhost:8080; 8 } 9 10 # http://localhost/wddd02/xxx -> http://localhost:8080/xxx 11 location /wddd02/ { 12 proxy_pass http://localhost:8080/; 13 } 14 15 # http://localhost/wddd03/xxx -> http://localhost:8080/wddd03*/xxx 16 location /wddd03 { 17 proxy_pass http://localhost:8080; 18 } 19 20 # http://localhost/wddd04/xxx -> http://localhost:8080//xxx,请注意这里的双斜线,好好分析一下。 21 location /wddd04 { 22 proxy_pass http://localhost:8080/; 23 } 24 25 # http://localhost/wddd05/xxx -> http://localhost:8080/hahaxxx,请注意这里的haha和xxx之间没有斜杠,分析一下原因。 26 location /wddd05/ { 27 proxy_pass http://localhost:8080/haha; 28 } 29 30 # http://localhost/api6/xxx -> http://localhost:8080/haha/xxx 31 location /wddd06/ { 32 proxy_pass http://localhost:8080/haha/; 33 } 34 35 # http://localhost/wddd07/xxx -> http://localhost:8080/haha/xxx 36 location /wddd07 { 37 proxy_pass http://localhost:8080/haha; 38 } 39 40 # http://localhost/wddd08/xxx -> http://localhost:8080/haha//xxx,请注意这里的双斜杠。 41 location /wddd08 { 42 proxy_pass http://localhost:8080/haha/; 43 } 44 }
参考原文CSDN博主「戴国进」 https://blog.csdn.net/JineD/article/details/121102344