Api网关:Nginx:Proxy模块:使用Proxy_Redirect重定向Location

tlin82大约 2 分钟DevOps工具Web解决问题api网关DevOpsNginx工具http404解决方案

前言

介绍使用Nginx功能强大的反向代理功能中的Proxy模块阶段的proxy_redirect,实现改写上游upstream的http header的location字段,返回给用户浏览器(或前端)。

使用场景

改写上游upstream的http header的location字段。这样确保用户浏览器(或前端)每次会发起改写后的request url,正确的URL。 这样在API网关Nginx上解决前、后端url不一致导致的http 404的问题。

使用举例

例如:上游后端有个用户身份验证接口服务url /auth, 反向代理url或前端请求url是/user/auth。简单说,就是给url增加1级目录。

  • 首先,反向代理配置使用了proxy_pass指定反向代理到一个上游后端服务.
location ^~ /user {
  proxy_pass proxy_pass http://svc_auth
}
  • 然后,使用rewrite 指令改写浏览器请求url /user/auth/auth。这样实现了在转发给后端前改写, 因为上游后端无法识别/user/auth(因为没有),否则会404。
location ^~ /user {
  rewrite ^/user(/.*)$ $1 break; 
}
  • 最后,把上游后端的返回url(location) 从/auth改写到/user/auth在转发给用户浏览器前改写, 这样确保后续每次前端(或浏览器)发起的都是/user/auth,而不是后端默认返回的/auth
location ^~ /user {
   proxy_redirect ~^(https?:\/\/[^\\\/:]+)(:(\d+))?(.*) $1$2/user$4; 
}

完整配置

upstream svc_auth {
   server 192.168.0.101:443
}

location  ^~ /user {

        rewrite ^/user(/.*)$ $1 break;   
        proxy_pass https://svc_auth;
        proxy_redirect ~^(https?:\/\/[^\\\/:]+)(:(\d+))?(.*) $1$2/user$4;  

    }