1

我有一个 iPad Safari 在 30 毫秒内发送两个 HTTP 请求(两个不同的 PNG)文件。

我认为即使在 Keep Alive HTTP 1.1 连接上,也应该有明确的请求/响应序列。

我看到的是 Safari 浏览器在 30 毫秒内发送了两个 GET 请求,而无需等待答案。这会导致某些 Web 服务器出现问题。

情况:我有一个 HTML5 加载 SVG 并进一步引用其他图像(如 PNG 和 GIF)。该问题不会出现在 iPhone 5 上,而是出现在 iPad 上。

请参阅此 wireshark 转储: http ://tinyurl.com/c7m37b9(第 116/117 帧)

iPad (1) 信息:版本 5.1.1 (9B206) 型号 MB2292FD Safari 5.1

[GET /Licht_3.gif HTTP/1.1
...
User-Agent: Mozilla/5.0 (iPad; CPU OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML,      like Gecko) Version/5.1 Mobile/9B206 Safari/7534.48.3
Accept: */*
...
Accept-Language: de-de
Accept-Encoding: gzip, deflate
Connection: keep-alive]

[GET /Licht_3.gif HTTP/1.1
Host: 192.9.225.251:8081
...
Accept-Language: de-de
Accept-Encoding: gzip, deflate
Connection: keep-alive]

[HTTP/1.1 200 OK
...
Content-Type: image/png
Content-Length: 3921]
4

3 回答 3

2

它看起来像HTTP 流水线

HTTP 流水线是一种在单个 TCP 连接上发送多个 HTTP 请求而不等待相应响应的技术。

于 2013-03-30T21:03:05.900 回答
1

我认为这可能是由于浏览器遵守了 HTTP 1.1 Spec 8.2.4。如果客户端通过中间层连接到服务器并且在连接关闭之前没有得到服务器的响应,这确实允许客户端重试请求。

我已经看到此错误,并发现以下链接很有帮助。

https://www.ravellosystems.com/blog/beware-http-requests-automatic-retries/

http://geek.starbean.net/?p=393

于 2016-09-26T21:09:38.553 回答
0

我也从移动 Safari 客户端看到了这一点。我能找到的唯一解决方法是在 Nginx 中为整个服务器禁用 keepalive。当 keepalive 被禁用时,我们不会收到重复的请求和/或流水线可能无法从 Safari 客户端工作。

在 Nginx 中,有一个 keepalive_disable 选项,但它仅适用于某些浏览器上的 POST 请求,并且没有太多选项。我们最终使用 keepalive_timeout 0 禁用了该服务器上的 keepalive;我希望将来有更好的解决方案。

我认为正确使用流水线会提交多个不同的请求,而不是重复的请求。

于 2014-09-09T18:06:46.293 回答