如何让Nginx支持带点的header
起因
公司有个比较久远的遗留APP项目,服务端用的是之前公司自己写的一个HTTP的服务器。最近这个项目被要求升级使用https。
但自研的HTTP服务器自身不支持https, 老代码了也已经没人没精力去再开发了。
一合计,就决定在前面架一个Nginx来做反向代理,用来终止SSL再转发请求给自写的HTTP服务器。
问题
咵咵咵,三下五除二,申请了https证书,配置了nginx,项目就跑起来了。
可测试阶段,发现有个别请求会失败。一检查,发现是服务端接收到的请求中,有一个Header的值没有获取到。
结果过程
挠了挠头皮,调查了下。发现这个自定义的header比较奇怪,名字中带有.
, 类似user.token
。
上网一通找,找到几个文章
大意就是虽然RFC中没有规定带.
的header是非法的,但Nginx默认就是不支持带.
的header的。如果需要支持,可以考虑使用ignore_invalid_headers来实现。
尝试着修改了nginx配置,添加了ignore_invalid_headers off;
后, 解决了该问题。
云厂商负载均衡服务的行为
Cloudflare
Cloudflare会丢弃带.
的header
Cloudflare strips any header that contains dots (.) from origin web server responses. For example, the origin web server header test.header:data is removed by Cloudflare’s proxy.
来自: How does Cloudflare handle HTTP Request headers?
AWS
待调查,参考资料