什么请求浏览器的“F5”和“Ctrl + F5”刷新生成?

在Web浏览器中, F5Ctrl + F5触发的操作有标准吗?

我曾经在IE6和Firefox 2.x上做过实验。 F5刷新将触发一个HTTP请求,通过If-Modified-Since标题发送到服务器,而Ctrl + F5不会有这样的标题。 在我的理解中, F5会尝试尽可能多地使用缓存的内容,而Ctrl + F5则是放弃所有缓存的内容,然后再从服务器中检索所有的内容。

但今天,我注意到,在一些最新的浏览器(Chrome,IE8),它不再这样工作了。 F5Ctrl + F5都发送If-Modified-Since标头。

那么这应该如何工作,或者(如果没有标准的话)主要浏览器如何实现这些刷新功能有什么不同?

一般来说:

即使内容发生变化, F5也可能为您提供相同的页面,因为它可能会从缓存中加载页面。 但CtrlF5强制缓存刷新,并保证如果内容改变,你会得到新的内容。

这是由浏览器,但他们的行为类似的方式。

我已经测试过FF,IE7,Opera和Chrome。

F5通常只在修改页面时更新页面。 浏览器通常会尝试尽可能使用所有类型的缓存,并在请求中添加“If-modified-since”标头。 Opera通过发送“Cache-Control:no-cache”而不同。

CTRLF5用于强制更新,忽略任何缓存。 IE7增加了“Cache-Control:no-cache”,FF也增加了“Pragma:no-cache”。 Chrome会做一个正常的“If-modified-since”,而Opera会忽略这个关键字。

如果我没有记错的话,当你按下CTRLF5时,Netscape是第一个通过添加“Pragma:No-cache”来添加对缓存控制的支持的浏览器。

编辑:更新表

下面的表格更新了浏览器的刷新按钮(在Joel Coehoorn的请求之后)和“max-age = 0”缓存控制头部会发生什么情况。

更新表,2010年9月27日

 ┌────────────┬───────────────────────────────────────────────┐ │ UPDATED │ Firefox 3.x │ │27 SEP 2010 │ ┌────────────────────────────────────────────┤ │ │ │ MSIE 8, 7 │ │ Version 3 │ │ ┌─────────────────────────────────────────┤ │ │ │ │ Chrome 6.0 │ │ │ │ │ ┌──────────────────────────────────────┤ │ │ │ │ │ Chrome 1.0 │ │ │ │ │ │ ┌───────────────────────────────────┤ │ │ │ │ │ │ Opera 10, 9 │ │ │ │ │ │ │ ┌────────────────────────────────┤ │ │ │ │ │ │ │ │ ├────────────┼──┼──┼──┼──┼──┼────────────────────────────────┤ │ F5│IM│I │IM│IM│C │ │ │ SHIFT-F5│- │- │CP│IM│- │ Legend: │ │ CTRL-F5│CP│C │CP│IM│- │ I = "If-Modified-Since" │ │ ALT-F5│- │- │- │- │*2│ P = "Pragma: No-cache" │ │ ALTGR-F5│- │I │- │- │- │ C = "Cache-Control: no-cache" │ ├────────────┼──┼──┼──┼──┼──┤ M = "Cache-Control: max-age=0" │ │ CTRL-R│IM│I │IM│IM│C │ - = ignored │ │CTRL-SHIFT-R│CP│- │CP│- │- │ │ ├────────────┼──┼──┼──┼──┼──┤ │ │ Click│IM│I │IM│IM│C │ With 'click' I refer to a │ │ Shift-Click│CP│I │CP│IM│C │ mouse click on the browsers │ │ Ctrl-Click│*1│C │CP│IM│C │ refresh-icon. │ │ Alt-Click│IM│I │IM│IM│C │ │ │ AltGr-Click│IM│I │- │IM│- │ │ └────────────┴──┴──┴──┴──┴──┴────────────────────────────────┘ 

测试版本:

  • Firefox 3.1.6和3.0.6(WINXP)
  • MSIE 8.0.6001和7.0.5730.11(WINXP)
  • Chrome 6.0.472.63和1.0.151.48(WINXP)
  • Opera 10.62和9.61(WINXP)

笔记:

  1. 版本3.0.6发送I和C,但是3.1.6在一个新的选项卡中打开页面,仅用“I”作出正常的请求。

  2. 版本10.62什么都不做。 9.61可能会做C,除非它是我旧桌子上的拼写错误。

有关Chrome 6.0.472的注意事项 :如果您执行强制重新加载(如CTRLF5 ),它的行为就像内部标记为始终强制重新加载。 如果您转到地址栏并按回车键,标志将被清除。

我已经实现了跨浏览器兼容页面来测试浏览器的刷新行为,并获得类似于@some的结果,但对于现代浏览器:

在这里输入图像描述

至少在Firefox(v3.5)中,缓存似乎被禁用,而不是简单的清除。 如果页面上有同一图像的多个实例,则会多次传输。 对于随后通过Ajax / JavaScript添加的img标签也是如此。

所以如果你想知道为什么浏览器在你的自动刷新的Ajax站点上一直下载几百个相同的小图标,那是因为你最初使用CTRLF5加载了这个页面。

根据页面是否有焦点,IE7 / 8/9似乎有不同的表现。

如果您单击该页面并按CTRL + F5,则请求标头中将包含“Cache-Control:no-cache”。 如果你点击位置/地址栏,然后按CTRL + F5它不是。

当用户按F5时,虽然新的请求去到Web服务器并得到一个响应请求。 但是,当响应标头解析时,请检查浏览器缓存中所需的信息。 如果缓存中所需的信息尚未过期,则该信息将从缓存本身中恢复。

当用户点击CTRLF5时,即使新的请求转到Web服务器并得到响应。 但是这次当响应头被解析时,它不检查缓存中的任何所需的信息,并且只将所有更新的信息从服务器中取出。