Chrome发送额外请求该怎么办?

52

谷歌浏览器会发送多个请求来获取页面,这显然不是一个bug,而是一种特性。作为开发者,我们只需要应对它。

据我所知,在五分钟内的调查中,谷歌浏览器这样做只是为了使浏览更快,因此如果一个连接断开,第二个连接将接管。

我想,如果网站开发得好,那么其功能不会因此受到影响,因为多个请求并不是新鲜事。

但是我不确定是否考虑了此特性可能产生的所有情况。

是否存在任何特殊情况?有没有最佳实践来处理它们?

更新1:现在我明白为什么使用Chrome打开我的银行页面会出错!它说:“浏览器只能打开一个窗口。”这是他们应对安全威胁的解决方案吗?!!


2
你有官方文档的链接吗? - fearofawhackplanet
我从stackoverflow上的一个问题中得到了这个信息: "Chrome在其开发版本中正在尝试一些激进的策略(我认为很酷)。他们正在主动地向服务器打开套接字,并且如果第一次尝试没有快速获得响应,会再打开第二个套接字。非常容易看出,这种做法中的一个错误,甚至仅是预期行为,都可能触发滥用过滤器。但是,正如我所说,我认为这是值得做的。如果网页加载更快,所有这些网络创业公司将赚更多的钱。" - Cg Alive
1
一个Chromium问题涉及到这个:http://code.google.com/p/chromium/issues/detail?id=39402#c11 - jrummell
当获取某些PDF文件时,我会收到多个相同URL的请求。请求数量取决于文件,因此可能是文件中的某些内容。对于以前没有请求过的新文件,服务器返回http-code 200,然后对于所有后续文件返回304。(200表示“好的,这里是文档”,304表示“您缓存中的页面仍然有效”),因此Chrome接收了第一个请求,并将其放入缓存中,然后使用第一个请求的缓存标记请求其他请求。(我在Firefox中没有看到这种情况)。 - ctrl-alt-delor
1
据我所知,这不是Chrome的功能。通常情况下,这是由于特定原因造成的。在这篇文章中,您将找到许多可能的原因:https://dev59.com/RnI-5IYBdhLWcg3wHUhB#66266716 - Andrew F.
14个回答

18

您最好遵循标准的Web开发最佳实践:不要通过GET调用更改应用程序状态。

如果您担心,建议更新数据层单元测试以复制GET调用并确保它们返回相同的数据。

(顺便说一句,我没有看到这种行为与Chrome 8.0.552.224发生,这是非常新的版本?)


我使用的是相同的版本,但我看到了这种行为。尝试调用一个脚本来递增文件中的数字。 - Cg Alive
我还没有复现它,我写了一个快速脚本来追加到一个文件中,每次点击只得到一个文件行。我正在使用Linux版本,所以也许它在那里还没有启用。 - Peter
不总是可以避免在GET请求中更改应用程序状态。如果用户选择了“自动登录”,我们会分析cookie,确定他们可以自动登录,然后更新User对象中“上次登录”的时间属性。这是一种应用程序状态的更改。 - Volksman

18

在编写服务器应用程序时,我发现一个行为,早期的答案可能不正确。

Chrome将单个请求分成多个http请求以并行获取资源。在这种情况下,它是一个图像,它将其作为单独的http get请求获取。

我已经附上了通过wireshark捕获的数据包截图。

这是一个简单的get请求到端口8080,服务器返回一个hello消息。

Chrome发送第二个get请求以获取您在打开的每个选项卡顶部看到的喜爱图标。这不是为了应对任何超时或类似事情而进行的第二次获取。

应该考虑到它是跨浏览器不同的另一个元素。然而,自2018年以来,在浏览器中使用多个http请求并行处理是一种标准做法。

这里是我后来找到的一个参考问题。

Chrome发送两个请求 SO

chrome requests favorite icon

Chrome问题在Google Code上


8

这也可能是由于带有空的 href 属性的 link 标签引起的,至少在 Chromium(v41)中是如此。例如,下面每一行都会在页面上生成一个额外的查询:

<link rel="shortcut icon" href="" />
<link rel="icon" type="image/x-icon" href="" />
<link rel="icon" type="image/png" href="" />

看起来在页面中寻找空属性是一个很好的起点,可以是hrefsrc


4

4

当我正在输入一个URL时,自动填充会在我还没输入完之前就找到了匹配。我的观察是在这种情况下(错误/特性/其他),Chrome会接受这个匹配并取回相应的页面,我猜想这样做是为了获得自己加载页面时缓存优势。


3
我刚刚实现了一个单次使用的Guid令牌(asp.net/TSQL),当一系列两个表单(+确认页面)中的第一个表单生成时,该令牌被生成。生成令牌后,将其记录为“待处理”状态存储在数据库中。 Guid令牌作为隐藏字段随着帖子一起发送,并在用户操作完成(付款)后最终标记为关闭。这种机制确实有效,并且可以防止在支付完成后重新提交任何表单。然而,我看到有2或3个(!?)附加请求快速地相继生成了其他的令牌。第一个请求是呈现给用户的(localhost - 比如我),其中生成的内容是其他两个请求结束后得到的。 我最初想知道为什么对于一个页面印象Page_Load处理程序会触发多次,所以我在Http.Context.Current中尝试了一个标志 - 但是使我沮丧的是,后续的请求在相同的URL上进行,但没有发布数据,并且Http.Context.Current数组为空 - 也就是说,完全(实际上)分开的http请求。 该如何处理?一些类似于拒绝在第一个表单处理完成前接受后续页面内容请求的令牌和逻辑吗?我猜这可能会在全局上下文中发生?

2
只有当我启用了 Chrome 的 "webug" 扩展(它是 FirePHP 在 Chrome 上的替代品)时,才会发生这种情况。如果我禁用该扩展,服务器只会收到一个请求。

2
我为Webug中的这个错误道歉——在当前版本中已经修复了。 - fedosov

2
在我的情况下,Chrome(v65)会发出第二个GET /favicon.ico请求,即使响应是text/plain,因此明显没有<link引用图标。在我回复404后它停止了这样做。
Firefox(v59)发送了2个请求来获取favicon;同样,在返回404后停止了这样做。

2

我想就这个问题进行更新。我遇到了相同的问题,但是关于css样式。

我查看了所有的src、href和script标签,但没有一个空字符串。罪魁祸首是这个条目:

<div class="Picture" style="background-image: url('');">&nbsp;</div>

确保您还检查了空URL字符串的样式


1
我遇到了这个问题,但这里提供的所有解决方案都不是问题所在。对我来说,它是由Chrome中的APNG扩展引起的(支持动画PNG)。一旦我禁用了该扩展,我就不再在浏览器中看到图像的重复请求。请注意,无论页面是否输出PNG图像,禁用此扩展都可以解决问题(即,APNG似乎会导致图像的问题,而不管图像类型,它们不必是PNG)。
我也有许多其他的扩展程序(例如"Web Developer",许多人认为这是问题所在),但它们并不是问题所在。禁用它们并没有解决问题。我也在开发者模式下运行,并且这对我没有任何影响。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接