nginx反向代理proxy_pass绝对路径和相对路径

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

1.1 绝对路径

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

当访问 http://127.0.0.1/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://127.0.0.1/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://127.0.0.1/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:指令,重写路径结束后。

3.参考

  1. https://www.jianshu.com/p/b113bd14f584
  2. https://www.cnblogs.com/woshimrf/p/nginx-proxy-rewrite-url.html
  3. https://blog.51cto.com/jiuwo/2313252

你可能感兴趣的:(nginx反向代理proxy_pass绝对路径和相对路径)