6

我有一个非常简单的测试用例(以及 3 个小时的谷歌搜索和流感)

<!DOCTYPE HTML>
<html lang="en-US">
<head>
    <meta charset="UTF-8">
    <title>Два внешних скрипта</title>
</head>
<body>
    <script type="text/javascript" src="http://example.com/myscript.js"></script>
    <script type="text/javascript" src="http://example.com/myscript.js"></script>
</body>
</html>

服务器返回以下响应头

Connection: keep-alive
Expires: Mon, 04 Dec 1999 21:29:02 GMT
Cache-Control: no-store, no-cache, must-revalidate, max-age=0
Pragma: no-cache

在 chrome 中执行的这段代码会产生一个对服务器的请求,同样在 safari win 中。

这种行为无论如何是标准的吗?

这种行为是否有任何官方文档?

这是现金问题吗,因为我认为您仍然会收到带有 304 响应的请求?

免责声明:请不要建议随机化或避免此问题。我想了解这个问题的背景

4

2 回答 2

4

许多 HTTP 方法(GET、HEAD、PUT、DELETE)被定义为幂等的,这意味着多个相同的请求与单个请求具有相同的效果。浏览器会考虑到这一点,并将尽可能避免发送多个相同请求的开销。

有关详细信息,请参阅超文本传输​​协议 - HTTP/1.1 RFC 第 9.1 节。有关高级概述,请参阅有关 HTTP 的 Wikipedia 文章

于 2013-04-18T13:57:56.843 回答
4

发生这种情况的原因有两个。第一个是内容提供者可以设置expires标题,这样浏览器就不会发出第二个请求,第二个是浏览器实际上是如何处理GETHTTP 中的请求,例如包含脚本的 get 请求。

1.设置Expires Header的内容

内容提供者可以设置Expires标头,以便脚本第一次被浏览器缓存,因此不需要第二次请求。这是加快网页速度的良好标准 Web 实践,并且 expires 标头由脚本的主机服务器设置。Yahoo Developer 在Add an Expires or a Cache-Control Header中有一篇很好的文章,建议将 Expires 标头添加到脚本和样式表以及图像。

2.脚本Get方法是幂等的

GET请求,例如在网页上包含 javascript 的 get 请求是根据 HTTP 规范的安全方法。安全方法也是幂等的,因为多个请求与单个请求产生相同的结果,并且该方法仅用于检索数据。许多浏览器利用了 HTTP 规范的这一特性,并且不会为幂等方法发送多个请求。George Cummins 很好地解释了这一点, Mozilla Developer Network上提供了一篇关于此的文章。

于 2013-04-18T14:00:24.587 回答