当我试图访问一个位于http/2中Nginx代理后面的网站,而Apache后端也位于http/2中时,我在iOS设备上遇到了一个奇怪的问题。
在iOS设备上(且仅在iOS设备上),浏览器上显示ERR_INVALID_RESPONSE(无论使用的浏览器是什么:Safari、Chrome、...都有相同的行为)桌面浏览器(Linux或Windows)或Android设备绝对没有问题,问题似乎出在iOS设备上的底层网络堆栈上?...
Browser <---> Nginx with http/2 <---> Apache with http/2
[ ERR_INVALID_RESPONSE ]
如果我在Apache后端禁用HTTP/2,一切都很好...这种行为不取决于网站(在许多网站上都有同样的问题,有同样成功的解决方法)。
Browser <---> Nginx with http/2 <---> Apache with http/1.1 (http/2 DISABLED)
[ OK ]
似乎我不是唯一一个有此问题的人(https://community.ovh.com/t/resolu-vps-sous-plesk-site-innaccessible-sous-iphone-et-ipad/42227)
但是除了在Apache后端禁用http/2之外,我找不到任何关于问题根本原因的解释。
有什么想法吗?......
2条答案
按热度按时间6ioyuze21#
我在iOS Safari中获得了
ERR_INVALID_RESPONSE
,但在iOS Chrome中"无法解析响应"。相同:反向代理Nginx-Apache服务器。
根据上面链接中的non-accepted answer,我在HTTP/2中没有更改任何内容,只是在Nginx配置中添加了以下行并重新启动:
在此声明中:
添加此行:
ckocjqey2#
此处找到解决方案和根本原因:https://serverfault.com/questions/818535/nginxapache2letsencrypt-with-iphone-cannot-display-page
如果原始请求已在http/2中,iOS 10+不支持在响应中包含
Upgrade
标头。解决方案是隐藏Apache服务器提供的Upgrade
标头,因为Nginx已升级为Apache请求(Nginx发送http/1.1请求,Apache已在http/2中升级)。现在在iOS 12上遇到了相同/类似的问题,nginx 1.16.0代理到apache启用了http 2。解决方案是在nginx上禁用http 2,正确的解决方案描述如下https://trac.nginx.org/nginx/ticket/915或https://trac.nginx.org/nginx/ticket/1150-添加proxy_hide_header升级;将解决这个问题。使用升级头(可能只有),iOS无法处理“协议升级请求”以及该请求已经在http 2中。
apache 2.4和mod_proxy上的相同代理工作正常,因为默认情况下不会将此标头转发到客户端。