tomcat - OS X 上的 Tomcat 9.0.16:Safari 无法通过 HTTP/2 加载 gzip 压缩的内容
问题描述
我们正在使用 OpenJDK 11.0.1+13 在 OS X Mojave (10.14.3) 上运行 Tomcat 9.0.16 服务器,并且正在升级到 HTTP/2。但是,使用此配置,Safari 无法从服务器加载任何 gzip 压缩的内容并输出错误消息“网络连接丢失。”。这实际上只在加载 gzip 压缩的内容时发生;关闭 HTTP/2 升级协议 (org.apache.coyote.http2.Http2Protocol) 的压缩可以解决问题。其他浏览器似乎没有这个问题(在最新的 Edge、Firefox 和 Chrome 上测试成功)。
我们已经尝试过的:
- sendFile 的不同设置 -> 问题仍然存在
- compressionMinSize 的不同设置 -> 问题仍然存在
- 在 compressibleMimeType 中尝试不同的 MIME 类型 -> 问题仍然存在
- 在连接器中使用 org.apache.coyote.http11.Http11Nio2Protocol -> 问题仍然存在
- 在 APR 1.6.5 和 tomcat-native 1.2.21 的连接器中使用 org.apache.coyote.http11.Http11AprProtocol -> 问题仍然存在
目前,我们唯一的选择是要么使用不压缩的 HTTP/2,要么降级到 HTTP/1.1。我注意到 Debian apache2 bugtracker 上有一个类似的错误:https ://bugs.debian.org/cgi-bin/bugreport.cgi?bug=915103 。可能是相关的,因为这个错误看起来很相似,而且只有 Safari 受到影响。
有没有人有任何提示可能是这里的问题?Tomcat的错误?Safari 漏洞?JVM错误?直到现在,我还没有找到这个问题的根源,而且 Tomcat 的日志文件似乎也没有帮助。
非常感谢您的帮助。
解决方案
有完全相同的问题(tomcat 版本是 9.021)。问题是我们将 useSendfile 设置为 false。默认值为 true - 因此您可以将其排除在外。它以前确实有效,但后来苹果改变了一些东西。验证它是否适用于较旧的 MacOS 版本(想想 sierra 左右)。
<UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json" 压缩="on "compressionMinSize="1024" useSendfile="true"
/>
GZIP 和 Http2 现在可以在 Ipad(chrome、safari)上运行。
推荐阅读
- yii - Yii2 可以运行 .bat 文件或 python 脚本
- c# - 将 IFormFile 转换为 Stream 将内容类型设置为 application/octet-stream
- c++ - 针对 NULL 或 nullptr 进行测试
- c++ - Visual Studio 显示警告 C6330:当调用 'isdigit' 时需要 'unsigned char' 时,'char' 作为 _Param_(1) 传递。当我尝试构建
- python - 如何使用无法解码为 utf-8 的 unicode 处理网络消息
- collada - 如何在 pycollada 中创建 collada 对象
- spring-boot - 如何为@SpringBootTest 设置内容类型
- asp.net-core - 如何为 ASP.NET Core MVC 中的特定操作启用 http 连接?
- java - 尽管设备已收到消息,但未从 SMS 检索器 API 接收 SMS 内容
- node.js - 如何使用正确的内容类型将图像上传到 Azure Blob 存储