nginx根据http header转发到不同的服务

需求:后台服务变动比较大,需要上线.iOS版本已经开发完,准备提交审核.但是web端还是老的代码,后台还不能部署正式环境.

客户端会在每个请求中都带有一个头叫做"Accept",例如这里的"Accept":"application/vnd.demo.v2.0+json".

nginx中会提取出这个header,然后将v2.0版本的请求转发到预发布环境,其他版本的请求则依旧转发到生产环境.

以后web和android上线的时候,只需要直接把v2对应的跳转代码删了即可.

虽然也有其他的方式处理,例如加入一个"/v2"的location判断,但是觉得这样太恶心了,以后免不了一直留着这个多余的"/v2"或者还会有其他"/v3","/v4"...

OK,话说回来,下面是nginx示例代码.

map $http_accept $version {
  default "";
  "application/vnd.demo.v2.0+json" "v2.0";
}

server {
  listen                    80;
  server_name               demo.io;

  charset                   utf-8;
  autoindex                 off;

  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-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-Port $server_port;
    proxy_set_header X-Forwarded-Ssl on;

    if ($version="v2.0"){
      proxy_pass      http://demo_release;
      break;
    }

    proxy_pass      http://demo_production;
  }
}

你可能感兴趣的:(nginx根据http header转发到不同的服务)