nginx使用h2c协议时会导致http/1.1失效

2018-4-18 19:05:11

最近有个朋友问我nginx反代什么都变成了下载。
第一反应当然是content-type的问题,于是用命令行访问先检查一下返回的content-type到底是啥,结果
图片
难道是httpie的问题,于是又试了试curl
图片
这就很尴尬了
图片
查看一下返回的hexdump,基本和httpie的报错是一样的
那让我们回退最原始的telnet
图片
结果依旧令人崩溃,而且nginx的access log以及error log都没有任何消息,access log里甚至连这次请求都没有

后来,又发现,http有问题,但是https却能够正常访问
图片
检查对应域名的config,也没有什么异常的地方

最终,在默认config里,找到了这样一个配置
图片
把它拔掉以后,就恢复正常了

仔细总结一下,似乎是nginx对h2c协议的处理有问题,于是以"nginx h2c"为关键字,在Google上找到了https://trac.nginx.org/nginx/ticket/808 一篇三年前的nginx ticket,用curl发http2的请求也还是失败了
图片
curl是先用http1.1进行握手,然后升级http2的,那么如果直接发h2c的请求呢

nodejs的http2模块发送h2c请求是会跳过http1.1握手的(虽然这样做并不规范),于是写了个小demo
图片
看上去似乎是正常的,也就是说,nginx的h2c部分也没遵循规范,先用http1.1握手