Infobug - 转载 https://infobug.cn/tag/%E8%BD%AC%E8%BD%BD/ [转载] Nginx 反代路径 https://infobug.cn/nginx_proxy.html 2023-05-09T11:14:00+08:00 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 代理路径添加urilocation /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