我有一个 EC2 实例,Apache 作为网络服务器(和 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)"
Run Code Online (Sandbox Code Playgroud)
我查看了 /etc/httpd/logs/error_log 和 /etc/httpd/logs/access_log 以及 Safari 控制台,但没有找到解决问题的任何提示。这就是我的知识有多远:-( 任何有关如何追踪此问题的提示将不胜感激。
Ste*_*ich 24
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 和Upgrade
它给我找了一个错误,因为 Apache 不应该用 HTTP/2 发送这个标头。
我的猜测是你有这样的配置
Protocols h2 h2c http/1.1
Run Code Online (Sandbox Code Playgroud)
鉴于浏览器无论如何都不支持没有 TLS 的 HTTP/2,并且 HTTP/2 over TLS 不需要 Upgrade 标头,我建议您将此配置替换为
Protocols h2 http/1.1
Run Code Online (Sandbox Code Playgroud)
这禁用了对没有 TLS 的不需要的 HTTP/2 的支持,但应该希望以这种方式摆脱 Upgrade 标头,因为这仅在从纯 HTTP 升级到纯 HTTP/2 时才需要。
编辑:根据 OP 的评论,更改Protocols配置没有帮助。有必要mod_http2通过删除Upgrade标头来明确解决此行为(即错误):
Header unset Upgrade
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12868 次 |
| 最近记录: |