如何使用 keep-alive + HTTP Pipe-lining 解决 iOS 8 中的图像交换问题?

如何使用 keep-alive + HTTP Pipe-lining 解决 iOS 8 中的图像交换问题?

自从 iOS8 以来,我管理的网站就遇到了一个间歇性的问题,即图片会与其他图片交换位置。这个问题在很多地方都提到过,但没有明显的解决办法:

https://discussions.apple.com/thread/6574663

http://tech.vg.no/2011/12/14/safari-on-ios-5-randomly-switches-images/

http://tech.vg.no/2012/02/01/safari-on-ios-5-randomly-switches-images-part-3/

看来这在 iOS5 上曾经是个问题。我们的服务器运行的是 Lightspeed,带有管道和保持活动功能。我的服务器管理员已确认管道会按照请求的顺序返回资源。他提到禁用保持活动功能可能会解决这个问题,但会大幅增加服务器负载,这将是一件非常糟糕的事情。

我的所有资产也都正确传递了内容长度。

我现在真的找不到解决办法了。我的许多用户都使用 iOS,这让每个人都感到非常沮丧。

这个问题是 iOS8 推出后才开始出现的,因为 iOS8 对 Safari 做了一些重大改动。在 iOS 8 的每个版本中,这个问题仍然存在。正如我所说,这个问题是间歇性的,我们的用户开始责怪我们,因为“其他网站都没有这个问题”。

我想知道是否有人可以解释一下这个问题?有没有其他人遇到过这个问题和/或找到了解决方案?

这里是我的一个相关网站的链接。

答案1

我们也遇到了这个问题,我们的解决方案是删除 HTML 中的所有标签,改用具有背景属性的 css 类。以下是示例:

.img_logo {
  background: url(../images/logo.png?v=20150427) no-repeat;
  width: 175px;
  height: 49px;
  display: block;
}

我知道这有点尴尬,但这是我们解决问题的唯一方法。一个缺点是我们必须删除图像的“alt”,但我想如果有必要,你可以用一些 javascript 来解决这个问题。

希望这可以帮助!

答案2

我正在处理我们刚刚推出的一个新网站上的这个问题。在 FF/Opera/Chrome 等浏览器上一切正常,但在 iOS8+ 上我遇到了严重的图像交换问题。我注意到很多报告此问题的网站都运行 Litespeed 网络服务器。我切换到 Apache 进行测试,果然,网站加载正常。我的主机(wiredtree.com,服务优质)和我查看了 Litespeed 中的一些配置选项,并禁用了以下两个选项:

  • 启用压缩
  • 启用动态压缩

禁用这两个功能后,网站加载正常,没有任何问题。虽然性能略有下降,但绝对值得。

一开始,我们尝试禁用 keep-alive 来有效禁用 HTTP Pipelining,但这并没有解决问题。以上是我见过的唯一一个真正能解决问题的方法。

希望这可以帮助处理同样问题的人!

答案3

这不是一个答案,而是一个解决问题的方法:

  1. 使用生产环境中的 Web 服务器,使用应用程序的开发版本自行重现问题。只需确保覆盖这一点即可。
  2. 在 Web 服务器上创建新的主机名/CNAME 条目和相应的虚拟主机,或者如果步骤 3 需要,在单独的端口上创建一个单独的 HTTP 服务器。这称为“测试 HTTP 服务器”
  3. 将您的测试/开发版本指向这个新的 HTTP 服务器并重现问题。在您可以做到这一点之前,不要转到步骤 4!
  4. 现在,在此测试 HTTP 服务器上,通过重定向或智能配置(尽可能使用 Apache),禁用 keepalive、压缩、https、缓存、流水线和您能想到的任何其他功能。重现问题并记下执行此操作和不执行此操作的所有配置元组。
  5. 将 Litespeed 服务器换成 Apahce。同样,对于优秀的系统管理员来说,这应该很简单。(啊哼)。重现问题。

如果你能在整个步骤 5 中重现该问题,并且没有设置配置更改或服务器软件更改会产生影响,问题出在 iOS 上,您可能无能为力。(但这种情况不太可能发生。)

然而,如果有一组配置更改不是依赖于 Litespeed(即,Apache 也存在这种情况),那么我们可以采取一种变通方法:使用指令BrowserMatch检测特定(一组)浏览器;设置此组 BrowserMatch 的配置参数。您会发现这种事情的例子可以追溯到 IE 3.0 和 Netscape 浏览器。

如果问题出在 Litespeed 上,请使用上述方法并向 Litespeed 支持提交错误。您是在为支持付费,不是吗?

答案4

在我看来,使用 http/2 协议似乎已经解决了这个问题。但我确信这个问题可能存在真正的修复/解决方案。

相关内容