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

时间:2013-04-18 13:34:51

标签: 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>

服务器返回以下响应标头

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请求的请求吗?

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

2 个答案:

答案 0 :(得分:3)

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

有关详细信息,请参阅Hypertext Transfer Protocol -- HTTP/1.1 RFC section 9.1。有关高级概述,请参阅Wikipedia article on HTTP

答案 1 :(得分:2)

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

1。设置过期内容标题

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

2。脚本获取方法是幂等的

根据HTTP规范,

GET请求(例如在网页上包含javascript的get请求)是安全的方法。安全方法也是幂等的,因为多个请求产生与单个请求相同的结果,并且该方法仅用于检索数据。许多浏览器利用HTTP规范的这个属性,并且不会发送多个幂等方法的请求。乔治康明斯很好地解释了这一点,有关这方面的文章可以从Mozilla Developer Network获得。