我有一个非常简单的测试用例(以及 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 中执行的代码会向服务器发出一个请求,在 opera、safari win 中也是如此。
这种行为是标准的吗?
是否有关于此行为的任何官方文档?
这是 cashe 问题吗,因为我认为您仍然会收到带有 304 响应的请求?
免责声明:请不要建议随机化或避免此问题。我想了解这个问题的背景
最佳答案
发生这种情况的原因有两个。第一个是内容提供者可以设置 expires
标题,这样浏览器就不会发出第二个请求,第二个是浏览器实际上如何处理 HTTP 中的 GET
请求,例如包含脚本的 get 请求。
1。设置过期内容头
内容提供者可以设置Expires
header 以便脚本第一次被浏览器缓存,因此没有第二次请求。这是加速网页的良好标准 Web 实践,过期 header 由脚本的主机服务器设置。 Yahoo Developer 在 Add an Expires or a Cache-Control Header 上有一篇关于此的好文章除了图像之外,它还建议将 Expires header 添加到脚本和样式表中。
2。 Script Get 方法是幂等的
GET
请求,例如在网页上包含 javascript 的 get 请求,根据 HTTP 规范是安全的方法。安全方法也是幂等的,因为多个请求产生与单个请求相同的结果,并且该方法仅用于检索数据。许多浏览器利用 HTTP 规范的这个属性,不会发送多个幂等方法请求。 George Cummins 很好地解释了这一点,有关这方面的文章可从 Mozilla Developer Network 获得。 .
关于javascript - 为什么重复的脚本标签不会产生重复的请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16084470/