1.nginx的proxy_pass配置路径,加与不加“/”差异巨大

1.1 绝对路径

location /proxy {
proxy_pass http://192.168.137.181:8080/;
}

当访问 http://infobug.cn/proxy/test/test.txt时,nginx匹配到/proxy路径,把请求转发给192.168.137.181:8080服务,实际请求路径为
http://10.0.0.1:8080/test/test.txt,nginx会去掉匹配的“/proxy”。

1.2 相对路径

location /proxy {
    proxy_pass http://10.0.0.1:8080;
}

当访问 http://infobug.cn/proxy/test/test.txt时,nginx匹配到/proxy路径,把请求转发给192.168.137.181:8080服务,实际请求代理服务器的路径为
http://192.168.137.181:8080/proxy/test/test.txt, 此时nginx会把匹配的“/proxy”也代理给代理服务器。

1.3 代理路径添加uri

location /proxy {
    proxy_pass http://10.0.0.1:8080/static01/;
}

当访问 http://infobug.cn/proxy/test/test.txt时,nginx匹配到/proxy路径,把请求转发给192.168.137.181:8080服务,实际请求代理服务器的路径为
http://10.0.0.1:8080/static01/test/test.txt
实际上2、3是一种情况,即加了“/”就会去掉匹配前缀。这就引出了下一个问题。

2.nginx反向代理去掉前缀的另一种方法

我们使用nginx的很多时候都需要去掉前缀。前缀只是为了让nginx用来区分转发到哪个服务器,不是实际URL的一部分。例如我们需要代理访问http://10.0.0.1:8080/test/test.txt,如果不去掉前缀,nginx代理访问的就是http://192.168.137.181:8080/proxy/test/test.txt,那么这时候就需要改变代理服务器原来写好的url,这是不合理的。
一个种方案是上面提到的proxy_pass后面加根路径“/”。另一种方案是使用正则重写url。例如:

location /resource {
    rewrite  ^/resource/?(.*)$ /$1 break;
    proxy_pass http://192.168.137.189:8082/; # 转发地址
}

这里的

rewrite "^/resource/(.)$" /$1 break

就是路径重写,其中:

"^/resource/(.)$":匹配路径的正则表达式,用了分组语法就是(.),把/resource/以后的所有部分当做1组
/$1:重写的目标路径,这里用$1引用前面正则表达式匹配到的分组(组编号从1开始,也就是api),即/resource/后面的所有。这样新的路径就是除去/resource/以外的所有,就达到了去除/resource前缀的目的;
break:指令,重写路径结束后。

来源

https://www.jianshu.com/p/ec14f55fd209

最后修改:2023 年 05 月 09 日
如果觉得我的文章对你有用,请随意赞赏