背景
在应用 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;
}
}