起因

公司有个比较久远的遗留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

待调查,参考资料

Reference

留言