What requests do browsers' “F5” and “Ctrl + F5” refreshes generate?
是否存在F5和Ctrl + F5在Web浏览器中触发的操作的标准?
我曾经在IE6和Firefox 2.x中做过实验。 F5刷新将触发使用
但是今天,我注意到在一些最新的浏览器(Chrome,IE8)中它不再以这种方式工作了。 F5和Ctrl + F5都发送
那么这应该如何工作,或者(如果没有标准)主要浏览器如何实现这些刷新功能?
这取决于浏览器,但它们的行为方式类似。
我测试过FF,IE7,Opera和Chrome。
F5通常仅在修改页面时才更新页面。浏览器通常会尝试尽可能多地使用所有类型的缓存,并在请求中添加"If-modified-since"标头。 Opera通过发送"Cache-Control:no-cache"而不同。
CTRL-F5用于强制更新,忽略任何缓存。 IE7增加了一个"Cache-Control:no-cache",FF也增加了"Pragma:no-cache"。 Chrome执行正常的"If-modified-since"并且Opera忽略了密钥。
如果我没记错的话,当你按下CTRL-F5时,Netscape是第一个通过添加"Pragma:No-cache"来添加对缓存控制的支持的浏览器。
编辑:更新的表格
下表更新了有关单击浏览器刷新按钮(Joel Coehoorn请求后)和"max-age = 0"Cache-control-header时会发生什么的信息。
更新的表格,2010年9月27日
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | ┌────────────┬───────────────────────────────────────────────┐ │ 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)
笔记:
版本3.0.6发送I和C,但3.1.6在新选项卡中打开页面,
仅使用"I"发出正常请求。
版本10.62什么都不做。 9.61可能会做C,除非它是我旧桌子上的拼写错误。
关于Chrome 6.0.472的注意事项:如果执行强制重新加载(如CTRL-F5),则其行为类似于内部标记的url始终执行强制重新加载。如果您转到地址栏并按Enter键,该标志将被清除。
一般来说:
即使内容已更改,F5也可能会为您提供相同的页面,因为它可能会从缓存中加载页面。但Ctrl-F5强制缓存刷新,并保证如果内容发生更改,您将获得新内容。
我已经实现了跨浏览器兼容的页面来测试浏览器的刷新行为(这里是源代码)并获得类似于@some的结果,但对于现代浏览器:
至少在Firefox(v3.5)中,缓存似乎被禁用而不是简单地清除。如果页面上有多个相同图像的实例,则会多次传输。对于随后通过Ajax / JavaScript添加的
因此,如果您想知道为什么浏览器会在您的自动刷新Ajax网站上继续下载相同的小图标几百次,那是因为您最初使用CTRL-F5加载了该页面。
IE7 / 8/9似乎表现不同,具体取决于页面是否有焦点。
如果单击页面并且CTRL + F5,则请求标头中包含"Cache-Control:no-cache"。如果您单击位置/地址栏,然后按CTRL + F5它不是。
当用户按下F5时,尽管新请求也会转到Web服务器并获得对请求的响应。但是当响应标头被解析时,它会检查浏览器缓存中所需的信息。如果缓存中的所需信息尚未过期,则从缓存本身恢复该信息。
当用户单击CTRL-F5时,即使那时新请求也会转到Web服务器并获得响应。但是这次当响应标头被解析时,它不会检查缓存中的任何所需信息,并且仅将所有更新的信息从服务器中提取。