Nginx代理proxy pass配置去除前缀
很多时候,我们需要根据url的前缀转发到不同的服务。
比如url的前缀对下游的服务是不需要的,除非下游服务添加context-path, 但很多时候我们并不喜欢加这个。如果Nginx转发的时候,把这个前缀去掉就好了。
一个种方案是proxy_pass后面加根路径/
location /user/ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://user/;
}
location /order/ {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Scheme $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://order/;
}
/user/
表示匹配前缀是user
的请求,proxy_pass的结尾有/
, 则会把/user/*
后面的路径直接拼接到后面,即移除user
.
要注意
proxy_pass
后的url最后的/
当加上了/,相当于是加了路径,则nginx不会保留location中匹配的路径部分
如果没有/,则会把匹配的路径部分保留
另一种方案是使用rewrite
location /user/ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;
rewrite ^/user/(.*)$ /$1 break;
proxy_pass http://user;
}
location /order/ {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Scheme $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 重写URL 去除order
rewrite ^/order/(.*)$ /$1 break;
# 关键字 正则表达式 代替的内容 重写类型
# rewrite后面的参数是一个简单的正则 ^/order/(.*)$,
proxy_pass http://order;
}
注意到proxy_pass结尾没有
/
,rewrite
重写了url
nginx location、proxy_pass 后面的url 加与不加/的区别
在nginx中配置proxy_pass时,当在后面加上 / ,相当于绝对路径,则nginx不会把location中匹配的路径部分代理走;如果没有/,则会把匹配的路径代理走。
情况1:
# `http://192.168.1.9/proxy/test.html` 进行访问
location /proxy/ {
proxy_pass http://127.0.0.1:81/;
}
会被代理到http://127.0.0.1:81/test.html 这个url。
location /proxy {
proxy_pass http://127.0.0.1:81/;
}
会被代理到http://127.0.0.1:81//test.html 这个url。 # 请注意这里的双斜线
情况2:
# `http://192.168.1.9/proxy/test.html` 进行访问
location /proxy/ {
proxy_pass http://127.0.0.1:81;
}
会被代理到http://127.0.0.1:81/proxy/test.html 这个url。
location /proxy {
proxy_pass http://127.0.0.1:81;
}
会被代理到http://127.0.0.1:81/proxy/test.html 这个url。
情况3:
# `http://192.168.1.9/proxy/test.html` 进行访问
location /proxy/ {
proxy_pass http://127.0.0.1:81/fly/;
}
会被代理到http://127.0.0.1:81/fly/test.html 这个url。
location /proxy {
proxy_pass http://127.0.0.1:81/fly/;
}
会被代理到http://127.0.0.1:81/fly//test.html 这个url。 请注意这里的双斜杠。
情况4:
# `http://192.168.1.9/proxy/test.html` 进行访问
location /proxy/ {
proxy_pass http://127.0.0.1:81/fly;
}
会被代理到http://127.0.0.1:81/flytest.html 这个url。 请注意这里的fly和test.html之间没有斜杠
location /proxy {
proxy_pass http://127.0.0.1:81/fly;
}
会被代理到http://127.0.0.1:81/fly/test.html 这个url。
参考
1.https://www.cnblogs.com/woshimrf/p/nginx-proxy-rewrite-url.html
2.https://blog.csdn.net/leiwuhen92/article/details/131210712