背景

在应用nginx做代理web容器转发的时候,依据url的前缀转发到不同的服务,呈现了接口报405的谬误,网上查了好多文档,说了好多种起因,通过排查定位,最终定位到的起因是申请的url地址不对,多了一个转发的前缀。

解决

因为定位到了起因是申请的时候多了一个web容器/assetslog的上下文地址,如下图

所以如果能够在转发的时候,将这个前缀去掉,就能够失常拜访,比方:

a.com/user/user.html转发到用户服务b.com/user.htmla.com/order/order.html转发到订单服务b.com/order.html

即,url的前缀对上游的服务是不须要的,除非上游服务增加context-path, 但很多时候咱们并不喜爱加这个。如果Nginx转发的时候,把这个前缀去掉就好了。

办法1:proxy_pass前面加根门路/

server {    listen              80;    server_name         a.com;    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_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://order/;    }}

^~/user/示意匹配前缀是user的申请,proxy_pass的结尾有/, 则会把/user/*前面的门路间接拼接到前面,即移除location上的规定 user和order

办法2:应用rewrite,留神到proxy_pass结尾没有/, rewrite重写了url

server {    listen              80;    server_name         a.com;    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_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 ^/order/(.*)$ /$1 break;        proxy_pass http://order;    }}

此外nginx还能够简略的间接把申请一成不变的转发给下一个服务
比方,拜访a.com/app/a/b.html, 要求转发到b.com/app/a/b.html
设置proxy_pass即可。申请只会替换域名

server {    listen              80;    server_name         a.com;    location / {        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://b.com;    }}