Do not go gentle into that good night.|

stepForward-

园龄:3年8个月粉丝:5关注:3

2022-07-04 17:41阅读: 11评论: 0推荐: 0

Nginx配置

Nginx配置中的location指令和proxy_pass指令

location指令中的路径匹配中有一个前缀匹配的模式,它以^~开头,作用是对uri以某个常规字符串开头进行匹配,也称该匹配的字符串为前缀字符串。例如如下:

server{
    listen  80;
    server_name  localhost;
    location ^~/ROOT {
    	root html;
    	index index.html index.htm;
	}
}

​ 它会对请求过来的url进行以前缀字符串为"ROOT"进行匹配,请求路径中必须包含前缀字符串”ROOT“。它可以匹配如下请求路径:

http://localhost:80/ROOT/123;

http://localhost:80/ROOT123/123;

http://localhost:80/ROOT/ROOT123/123;

​ 但是不能匹配像下面这些路径:

http://localhost:80/ROO/ROOT/123; 不是以规定的前缀字符串开头,即使后面出现了完整的前缀字符串

http://localhost:80/ROO/123; 前缀字符串不完整

​ 这就是对于location前缀匹配中的一些注意点。具体的其他匹配规则(正则匹配,精确匹配和通用匹配以及他们的优先级可以看此的链接,讲的非常详细!Nginx之location详解)

proxy_pass指令:简单来说是用于反向代理的一个指令,它是内嵌在location指令块中一起使用的。

​ 在nginx中配置proxy_pass代理转发时,如果在proxy_pass后面的url加/,表示绝对根路径如果没有/,表示相对路径,把匹配的路径部分也给代理走。(这句话很关键!!! )

​ 当它和location中前缀匹配一起使用时就会出现一些细节问题,具体如下:

​ 我通过proxy_pass指令反向代理到Tomcat服务器上,配置如下:

​ 两种情况之一:proxy_pass后面的url不加 / :

# 定义一组Tomcat服务器负载均衡
upstream httpds{
    server 192.168.159.132:8080 weight=5;
}
    # 反向代理服务器
    server {
        listen       80;
        server_name  localhost;
        location ^~/abc {
             proxy_pass http://httpds;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

然后在Tomcat服务器上的ROOT文件目录如下:(跳转成功后默认访问此目录)

image-20220704165746262

然后请求路径如下:

image-20220704165909054

可以看出该请求路径已经通过nginx的反向代理转发到了Tomcat中,但是由于proxy_pass指令的规则,如果在proxy_pass后面的url加/,则会带上location上的匹配路径的那一部分,但是Tomcat根据ip/abc/该目录无法找到所要请求的资源,所以返回Tomcat下的404。

image-20220704170413635

​ 带上匹配路径的那一部分(abcde)

然后我们在webapp新建一个项目名叫abcde与uri相同:其中index.html内容就是”abcde"。

image-20220704171058027

然后再刷新以下浏览器:

image-20220704171136878

成功显示页面。

两种情况之二:proxy_pass后面的url加 / :

# 定义一组Tomcat服务器负载均衡
upstream httpds{
    server 192.168.159.132:8080 weight=5;
}
    # 反向代理服务器
    server {
        listen       80;
        server_name  localhost;
        location ^~/abc {
             proxy_pass http://httpds/;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

通过同样的请求路径进行访问:

image-20220704171816055

成功显示页面。

然后以adcde请求uri进行访问:

image-20220704172014011

可以看到最终会去掉前缀字符串abc以/de/的uri路径去寻找请求的资源

同理在webapp新建一个项目名叫de与uri相同:其中index.html内容就是”de"。:

image-20220704172346665

然后刷新浏览器成功显示。

image-20220704172358679

如果我们以这样的请求路径去访问,会得到这样的一个结果:

image-20220704173210161

如果proxy_pass后面的rul加上/不适合多级目录下的请求

总结

​ location指令的前缀匹配与proxy_pass指令一起结合使用需要注意的:如果在proxy_pass后面的url加/,表示绝对根路径,并且会加上去掉前缀字符串(abc)加上剩下的那一部分(de)uri作为请求路径,并且不适合多级目录下的请求如果没有/,表示相对路径,把匹配的路径部分也给代理走。

本文作者:sunshineTv

本文链接:https://www.cnblogs.com/sunshineTv/p/16443788.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   stepForward-  阅读(11)  评论(0编辑  收藏  举报
@format
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起
  1. 1 404 not found REOL
404 not found - REOL
00:00 / 00:00
An audio error has occurred.