乐趣区

关于前端:解决nginx代理转发报错405-Method-Not-Allowed

背景

在应用 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;
    }
}
退出移动版