Nginx代理proxy pass配置去除前缀的实现
目录
- 一个种方案是proxy_pass后面加根路径/.
- 另一种方案是使用rewrite
使用Nginx做代理的时候,可以简单的直接把请求原封不动的转发给下一个服务。
比如,访问abc.com/appv2/a/b.html,要求转发到localhost:8088/appv2/a/b.html
简单配置如下:
upstreamone{ serverlocalhost:8088weight=5; } server{ listen80; server_nameabc.com; access_log"pipe:rollback/data/log/nginx/access.loginterval=1dbaknum=7maxsize=1G"main; location/{ proxy_set_headerHost$host; proxy_set_headerX-Real-IP$remote_addr; proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for; proxy_set_headerX-NginX-Proxytrue; proxy_passhttp://one; } }
即,设置proxy_pass即可。请求只会替换域名。
但很多时候,我们需要根据url的前缀转发到不同的服务。
比如
abc.com/user/profile.html转发到用户服务localhost:8089/profile.html
abc.com/order/details.html转发到订单服务localhost:8090/details.html
即,url的前缀对下游的服务是不需要的,除非下游服务添加context-path,但很多时候我们并不喜欢加这个。如果Nginx转发的时候,把这个前缀去掉就好了。
一个种方案是proxy_pass后面加根路径/.
server{ listen80; server_nameabc.com; access_log"pipe:rollback/data/log/nginx/access.loginterval=1dbaknum=7maxsize=1G"main; location^~/user/{ proxy_set_headerHost$host; proxy_set_headerX-Real-IP$remote_addr; proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for; proxy_set_headerX-NginX-Proxytrue; proxy_passhttp://user/; } location^~/order/{ proxy_set_headerHost$host; proxy_set_headerX-Real-IP$remote_addr; proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for; proxy_set_headerX-NginX-Proxytrue; proxy_passhttp://order/; } }
^~/user/表示匹配前缀是user的请求,proxy_pass的结尾有/,则会把/user/*后面的路径直接拼接到后面,即移除user.
另一种方案是使用rewrite
upstreamuser{ serverlocalhost:8089weight=5; } upstreamorder{ serverlocalhost:8090weight=5; } server{ listen80; server_nameabc.com; access_log"pipe:rollback/data/log/nginx/access.loginterval=1dbaknum=7maxsize=1G"main; location^~/user/{ proxy_set_headerHost$host; proxy_set_headerX-Real-IP$remote_addr; proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for; proxy_set_headerX-NginX-Proxytrue; rewrite^/user/(.*)$/$1break; proxy_passhttp://user; } location^~/order/{ proxy_set_headerHost$host; proxy_set_headerX-Real-IP$remote_addr; proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for; proxy_set_headerX-NginX-Proxytrue; rewrite^/order/(.*)$/$1break; proxy_passhttp://order; } }
注意到proxy_pass结尾没有/,rewrite重写了url。
关于rewrite
syntax:rewriteregexreplacement[flag] Default:— Context:server,location,if
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。