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”。
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”也代理给代理服务器。
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是一种情况,即加了“/”就会去掉匹配前缀。这就引出了下一个问题。
我们使用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:指令,重写路径结束后。