nginx:改变URL,不触发重定向
背景: 公司中应用是部署在虚拟机中,原有一个接口getparam接口,是由nginx 跳转到对应的虚拟机去处理,现在应用升级了, 不在直接到虚拟机去处理, 而是经过网管工程去进行分发处理:
即 : 原 nginx ---> xxx-service 变成 nginx --->api-gateway-->xxx-service
上下文由 /xxx/getparams/key ----> api-gateway/xxx/getparams/key
先附上解决方案:
rewrite ^(.*) api-gateway$1 break;
proxy_pass http://uc_login_state_new;
原nginx配置:
location ~ /xxx/getparam/* { (注:涉及机密,故公司上下文用xxx表示)proxy_set_header Host $host; #当为$host变量时,它的值在请求包含Host请求头时为Host 字段的值,在请求未携带Host请求头时为虚拟主机的主域名;proxy_set_header HTTP_CLIENT_IP $remote_addr; # 在web服务器端获得用户的真实ip 需 配置条件① 【 $remote_addr值 = 用户ip 】proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;# 在web服务器端获得 用户的真实ip 需配置条件②proxy_pass http://uc_login_state;
}upstream uc_login_state{server 127.0.0.1:8080 weight=1 max_fails=3 fail_timeout=30s;server 127.0.0.2:8080 weight=1 max_fails=3 fail_timeout=30s;check interval=5000 rise=2 fall=3 timeout=3000 type=http;
}
为了做到重新url ,而且不重定位,故使用rewrite 和 proxy_pass 结合的方式。如下修改:
location ~ /xxx/getparam/* { (注:涉及机密,故公司上下文用xxx表示)proxy_set_header Host $host; #当为$host变量时,它的值在请求包含Host请求头时为Host字段的值,在请求未携带Host请求头时为虚拟主机的主域名;proxy_set_header HTTP_CLIENT_IP $remote_addr; # 在web服务器端获得用户的真实ip 需配置条件① 【 $remote_addr值 = 用户ip 】proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;# 在web服务器端获得用户的真实ip 需配置条件②rewrite ^(.*) api-gateway$1 break; // ^代表以什么开头 (.*)表示任何; $1 表示符合要求的第一个字符串,这里就是值原url rewrite ^(.*) api-gateway$1: 含义就是 在原来的url前面加上 api-gateway ; break: 匹配之后就不进行匹配 proxy_pass http://uc_login_state_new; }upstream uc_login_state_new{server user.app.cb.cc weight=1 max_fails=3 fail_timeout=30s;check interval=5000 rise=2 fall=3 timeout=3000 type=http;}
按理说此时应该大功告成了,但是使用 nginx -s reload 重启nginx ,进行测试的时候就会报如下的错误:
提示: host 不存在, 为此我百思不得其解
为此研究了下 发现是 :
proxy_set_header Host $host;
这个家伙搞的鬼 :
nginx为了实现反向代理的需求而增加了一个ngx_http_proxy_module模块。其中proxy_set_header
指令就是该模块需要读取的配置文件。
在这里,所有设置的值的含义和http请求同中的含义完全相同,除了Host外还有X-Forward-For。
Host的含义是表明请求的主机名,因为nginx作为反向代理使用,而如果后端真是的服务器设置
有类似防盗链或者根据http请求头中的host字段来进行路由或判断功能的话,如果反向代理层的nginx
不重写请求头中的host字段,将会导致请求失败【默认反向代理服务器会向后端真实服务器发送请求,并且请求头中的host字段应为proxy_pass指令设置的服务器】
为此需要改为反向代理的新的域名:
proxy_set_header Host user.app.cb.cc;
至此完工。
2021.11.24 20:49
踩坑留
标签:
相关文章
-
无相关信息