apache iOS设备上的错误无效响应

k4emjkb1  于 2023-02-09  发布在  Apache
关注(0)|答案(2)|浏览(131)

当我试图访问一个位于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之外,我找不到任何关于问题根本原因的解释。
有什么想法吗?......

6ioyuze2

6ioyuze21#

我在iOS Safari中获得了ERR_INVALID_RESPONSE,但在iOS Chrome中"无法解析响应"。
相同:反向代理Nginx-Apache服务器。
根据上面链接中的non-accepted answer,我在HTTP/2中没有更改任何内容,只是在Nginx配置中添加了以下行并重新启动:
在此声明中:

location / {
   proxy_pass http://127.0.0.1:8080;
   proxy_set_header Host $host;
   proxy_set_header X-Real-IP $remote_addr;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
   proxy_set_header X-Forwarded-Proto $scheme;

}

添加此行:

proxy_hide_header Upgrade;
ckocjqey

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/915https://trac.nginx.org/nginx/ticket/1150-添加proxy_hide_header升级;将解决这个问题。使用升级头(可能只有),iOS无法处理“协议升级请求”以及该请求已经在http 2中。
apache 2.4和mod_proxy上的相同代理工作正常,因为默认情况下不会将此标头转发到客户端。

相关问题