我有一个非常简单的测试用例(以及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请求的请求吗?
免责声明:请不要建议随机或避免此问题。我想学习这个问题的背景
答案 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请求包括脚本。
内容提供者可以设置Expires
标头,以便第一次由浏览器缓存脚本,因此缺少第二个请求。这是用于加速网页的良好标准Web实践,并且expires头由脚本的主机服务器设置。 Yahoo Developer在Add an Expires or a Cache-Control Header上发表了一篇很好的文章,建议除了图像之外,还要将Expires标题添加到脚本和样式表中。
GET
请求(例如在网页上包含javascript的get请求)是安全的方法。安全方法也是幂等的,因为多个请求产生与单个请求相同的结果,并且该方法仅用于检索数据。许多浏览器利用HTTP规范的这个属性,并且不会发送多个幂等方法的请求。乔治康明斯很好地解释了这一点,有关这方面的文章可以从Mozilla Developer Network获得。