素材巴巴 > 程序开发 >

nginx:改变URL,不触发重定向

程序开发 2023-09-08 15:33:07

背景: 公司中应用是部署在虚拟机中,原有一个接口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 

                                                                                                                                                踩坑留


标签:

素材巴巴 Copyright © 2013-2021 http://www.sucaibaba.com/. Some Rights Reserved. 备案号:备案中。