背景
在应用nginx做代理web容器转发的时候,依据url的前缀转发到不同的服务,呈现了接口报405的谬误,网上查了好多文档,说了好多种起因,通过排查定位,最终定位到的起因是申请的url地址不对,多了一个转发的前缀。
解决
因为定位到了起因是申请的时候多了一个web容器/assetslog的上下文地址,如下图
所以如果能够在转发的时候,将这个前缀去掉,就能够失常拜访,比方:
a.com/user/user.html转发到用户服务b.com/user.html
a.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;
}
}
发表回复