nginx proxy_set_header指令之前见过,也在实际项目的配置中见过,自己并没有配置过,也不是特别清楚到底能干什么用。今天体验了一次,算是见识到了他的威力。
第一部分 实战
一、背景
公司的一个产品P(有Web端、桌面端、Android端、iPhone端),部分功能依赖第三方服务S,S部署在我们自己的服务器上,P不是自己调用S, 而是先调用中间服务M, M构造S服务的地址返回给P, P直接请求S服务。
二、问题
S服务不支持英文版,P如果在各个端上设置的语言是英文,S就会返回404错误。
三、解决思路
0、端上兼容(不完成可行)
端上设置英文版后,打开页面,把请求头中Accept-Language:en-us强制转换为:Accept-Language: zh-CN 。
桌面端兼容后可行,Android不可行(打开S服务有两次网络请求,第一次可以设置上header,第二次就没机会设置了,没有shouldOverrideUrlLoading)
1、S服务内部做兼容(不可行)
因为是第三方服务,基本是一个黑匣子,改造失败。
2、通过Nginx强制设置请求Header头中的语言。(可行)
在nginx conf中server块添加指令
proxy_set_header Accept-Language "zh-CN";
四、注意事项
如果Nginx服务中一个路由再次转发到另一个Nginx服务,两个服务都需要通过proxy_set_header设置,最终才生效。(具体原因待深究)
第二部分 proxy_set_header原理说明
一、定义
允许重新定义或者添加发往后端服务器的请求头。
二、语法
0、规则
proxy_set_header field value;
1、上下文
http, server, location
2、默认值
proxy_set_header Host $proxy_host; proxy_set_header Connection close;
三、用法
0、获取真实IP
proxy_set_header X-real-ip $remote_addr;