Nginx proxy_set_header初体验(改写header中的Accept-Language)

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;

参考:
https://www.cnblogs.com/kevingrace/p/8269955.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注