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 

                                                                                                                                                踩坑留

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值