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:指令,重写路径结束后。