it-swarm.dev

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

什么行动有标准 F5 和 Ctrl + F5 在网络浏览器中触发?

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

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

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

384
Morgan Cheng

一般来说:

F5 即使内容被更改,也可能会为您提供相同的页面,因为它可能会从缓存中加载页面。但 Ctrl - F5 强制缓存刷新,并保证如果内容发生更改,您将获得新内容。

295
dancavallaro

这取决于浏览器,但它们的行为方式类似。

我测试过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忽略了密钥。

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

编辑:更新表

下表更新了有关单击浏览器刷新按钮(在 Joel Coehoorn 的请求之后)和“max-age = 0”Cache-control-header时会发生什么的信息。

更新的表格,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的注意事项:如果你强制重新加载(比如 CTRL - F5)它的行为类似于内部标记的url总是强制重新加载。如果您转到地址栏并按Enter键,该标志将被清除。

520
some

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

enter image description here

68
Pavel Podlipensky

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

因此,如果您想知道为什么浏览器会在您的自动刷新Ajax网站上继续下载相同的小图标几百次,那是因为您最初使用 CTRL - F5

9
mermshaus

IE7/8/9似乎表现不同,具体取决于页面是否有焦点。

如果你点击页面和 CTRL+F5 然后,请求标头中包含“Cache-Control:no-cache”。如果单击位置/地址栏,请按 CTRL+F5 事实并非如此。

3
Phil Haselden

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

用户点击时 CTRL - F5 即使这样,新请求也会转到Web服务器并获得响应。但是这次当响应标头被解析时,它不会检查缓存中的任何所需信息,并且仅将所有更新的信息从服务器中提取。

1
Sunil