我有一个 EC2 实例,其中 Apache 是 Web 服务器(Wildfly 是应用服务器,尽管我不确定它是否与此问题有关)。在 EC2 前面,我有一个负载均衡器,它终止 HTTPS 并应用 SSL 证书。
HTTP 和 HTTPS 在 Chrome 中都可以正常工作,但不幸的是在 Safari 中不行。访问http://test.papereed.com工作正常,但访问https://test.papereed.com给出错误
"Safari can't open the page. The error is "The operation couldn't be completed. Protocol error" (NSPOSIXErrorDomain:100)"
我查看了 /etc/httpd/logs/error_log 和 /etc/httpd/logs/access_log 以及 Safari 控制台,但没有找到任何解决问题的提示。这就是我所知道的 :-( 如果能提供任何有关如何追踪此问题的提示,我将不胜感激。
答案1
curl(如果使用 HTTP/2 支持进行编译)会出现同样的问题,但会显示原因:
http2 错误:收到无效的 HTTP 标头字段:帧类型:1、流:1、名称:[升级]、值:[h2,h2c]
看起来您的服务器正在提供升级到 HTTP/2 的提议,尽管连接已经通过 HTTP/2 完成 - 这毫无意义。不仅如此,它还被明确禁止。来自RFC 7540 第 8.1.2.2 节:
端点不得生成包含特定于连接的标头字段的 HTTP/2 消息;任何包含特定于连接的标头字段的消息必须被视为格式错误(第 8.1.2.6 节)... 连接特定的标头字段,例如 Keep-Alive、Proxy-Connection、Transfer-Encoding 和升级
在我看来这是一个错误,因为 Apache 不应该使用 HTTP/2 发送这个标头。
我猜你的配置是这样的
Protocols h2 h2c http/1.1
鉴于浏览器不支持没有 TLS 的 HTTP/2,并且 TLS 上的 HTTP/2 不需要升级标头,我建议您将此配置替换为
Protocols h2 http/1.1
这会禁用对没有 TLS 的不需要的 HTTP/2 的支持,但希望通过这种方式摆脱升级标头,因为这只需要从纯 HTTP 升级到纯 HTTP/2。
编辑:根据 OP 的评论,更改Protocols
配置没有帮助。必须mod_http2
通过删除Upgrade
标题明确解决此行为(即错误):
Header unset Upgrade
答案2
答案3
Nginx:
Header unset Upgrade;
如果您的请求由代理执行,则无法工作,请改用
proxy_hide_header Upgrade;
。
答案4
我在 Apache 指令中设置了以下内容后:
Header unset Upgrade
NGinx 指令如下:
proxy_hide_header Upgrade;
Safari 的问题已消失。