根据不同的version访问不同的版本服务,或者访问不同的服务器,或者根据不同的host访问不同的内网服务器
实现原理
利用auth_request,当请求某个nginx的某个连接的时候,先去请求auth_request,再根据auth_request的返回动态设置代理url
nginx的配置
location /private/ {
auth_request /auth;
auth_request_set $url $sent_http_url;
proxy_pass $url;
...
}
location = /auth {
proxy_pass ...
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header X-Original-URI $request_uri;
}
在controller代码中
public Object authRequest(HttpServletRequest request,
HttpServletResponse servletResponse){
...
//获取原请求地址
System.out.println("X-Original-URI:"+request.getHeader("X-Original-URI"));
...
servletResponse.setHeader("url", "http://www.baidu.com");//返回新的地址
...
}
根据参数动态代理
nginx的配置
location /private/ {
set $req_version $arg_ReqVersion; # 将参数ReqVersion设置到变量req_version
auth_request /auth;
auth_request_set $url $sent_http_url;
proxy_pass $url;
...
}
location = /auth {
proxy_pass ...
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header ReqVersion $req_version; # 通过header传递参数
proxy_set_header X-Original-URI $request_uri;
}
需求
auth_request 需要nginx的 ngx_http_auth_request_module模块