iOS 设备上的 ERR_INVALID_RESPONSE
Posted
技术标签:
【中文标题】iOS 设备上的 ERR_INVALID_RESPONSE【英文标题】:ERR_INVALID_RESPONSE on iOS devices 【发布时间】:2021-12-29 10:26:18 【问题描述】:当我尝试访问位于 http/2 中的 nginx 代理后面的网站时,我在 ios 设备上遇到了一个奇怪的问题,Apache 后端也在 http/2 中。
在 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 之外,我没有找到任何关于问题根本原因的解释。
有什么想法吗?...
【问题讨论】:
【参考方案1】:在此处找到解决方案和根本原因: 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 代理面临相同/类似的问题 到启用了 http2 的 apache。解决方法是在 nginx 上禁用 http2, 此处描述了正确的解决方案 https://trac.nginx.org/nginx/ticket/915 或 https://trac.nginx.org/nginx/ticket/1150 - 添加 proxy_hide_header 升级;会解决的。使用 Upgrade 标头(可能仅)iOS 无法同时处理“协议升级请求” 请求已经在 http2 中。
apache 2.4 和 mod_proxy 上的相同代理可以正常工作,因为此标头是 默认不转发给客户端。
【讨论】:
以上是关于iOS 设备上的 ERR_INVALID_RESPONSE的主要内容,如果未能解决你的问题,请参考以下文章