为什么重复的脚本标签不会产生重复的请求?

Olg*_*lga 5 javascript http loading

我有一个非常简单的测试用例(还有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>
Run Code Online (Sandbox Code Playgroud)

服务器返回以下响应头

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
Run Code Online (Sandbox Code Playgroud)

在chrome中执行的这段代码会向服务器发出一个请求,在歌剧中也要向野生动物园致胜。

这是否符合标准?

是否有任何有关此行为的官方文档?

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

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

Geo*_*ins 5

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

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


Ker*_*nik 5

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

1、设置内容头部过期

内容提供者可以设置Expires标头,以便浏览器第一次缓存脚本,从而避免第二次请求。这是加速网页速度的良好标准 Web 实践,并且过期标头由脚本的主机服务器设置。Yahoo Developer 在Add an Expires or a Cache-Control Header上有一篇关于此的好文章,其中建议除了图像之外,还将 Expires 标头添加到脚本和样式表中。

2.脚本Get方法是幂等的

GET根据 HTTP 规范,请求(例如在网页上包含 javascript 的 get 请求)是安全的方法。安全方法也是幂等的,因为多个请求产生与单个请求相同的结果,并且该方法仅用于检索数据。许多浏览器利用 HTTP 规范的这一属性,并且不会发送多个幂等方法的请求。George Cummins 对此进行了很好的解释,并且可以从Mozilla 开发者网络获取有关此内容的文章。