在web浏览器中,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标头。

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


一般来说:

F5可能会给你相同的页面,即使内容被改变,因为它可能会从缓存加载页面。但Ctrl+F5强制缓存刷新,并将确保如果内容发生更改,您将获得新内容。


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

F5通常只在页面被修改时才更新页面。现代浏览器发送cache - control: max-age=0来告诉任何缓存一个资源被认为是新鲜的最大时间,相对于请求的时间。

CTRL-F5用于强制更新,忽略任何缓存。现代浏览器会发送Cache-Control: no-cache和Pragma: no-cache

如果我没记错的话,Netscape是第一个支持缓存控制的浏览器,它在你按CTRL-F5时添加了Pragma: No-cache。

┌───────────┬──────────────┬─────┬─────────────────┬──────────────────────────────┐
│ Version 4 │      F5      │  R  │      CLICK      │ Legend:                      │
│2021 MAY 19├──┬──┬──┬──┬──┼──┬──┼──┬──┬──┬──┬──┬──┤ C = Cache-Control: no-cache  │
│           │  │S │C │A │A │C │C │  │S │C │A │A │C │ I = If-Modified-Since        │
│           │  │H │T │L │L │T │T │  │H │T │L │L │T │ M = Cache-Control: max-age=0 │
│           │  │I │R │T │T │R │R │  │I │R │T │T │R │ N = Not tested               │
│           │  │F │L │  │G │L │L │  │F │L │  │G │L │ P = Pragma: No-cache         │
│           │  │T │  │  │R │  │+ │  │T │  │  │R │+ │ - = ignored                  │
│           │  │  │  │  │  │  │S │  │  │  │  │  │S │                              │
│           │  │  │  │  │  │  │H │  │  │  │  │  │H │ With 'CLICK' I refer to a    │
│           │  │  │  │  │  │  │I │  │  │  │  │  │I │ mouse click on the browsers  │
│           │  │  │  │  │  │  │F │  │  │  │  │  │F │ refresh-icon.                │
│           │  │  │  │  │  │  │T │  │  │  │  │  │T │                              │
│           │  │  │  │  │  │  │  │  │  │  │  │  │  │ 1: Version 3.0.6 sends I     │
├───────────┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤    and C, but 3.1.6 opens    │
│Brave 1.24 │M │CP│CP│- │- │M │CP│M │CP│CP│M │CP│CP│    the page in a new tab,    │
├───────────┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤    making a normal request   │
│Chrome 1   │MI│MI│MI│- │- │MI│- │MI│MI│MI│MI│MI│N │    with only I.              │
│Chrome 6   │MI│CP│CP│- │- │MI│CP│MI│CP│CP│MI│- │N │ 2: Version 10.62 does        │
│Chrome 90  │M │CP│CP│- │- │M │CP│M │CP│CP│M │CP│CP│    nothing. 9.61 might do C  │
├───────────┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤    unless it was a typo in   │
│Edge 90    │M │CP│CP│- │- │M │CP│M │CP│CP│M │CP│CP│    my old table.             │
├───────────┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤ 3: Opens the currernt tab in │
│Firefox 3.x│MI│- │CP│- │- │MI│CP│MI│CP│1 │M │MI│N │    a new tab, but does not   │
│Firefox 89 │M │- │CP│- │M │M │CP│M │CP│3 │M │M │3 │    refresh the page if it is │
├───────────┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤    cached in the browser.    │
│MSIE 8, 7  │I │- │C │- │I │I │  │I │I │C │I │I │N │                              │
├───────────┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤                              │
│Opera 10, 9│C │- │- │2 │- │C │- │C │C │C │C │- │N │                              │
│Opera 76   │M │CP│CP│- │- │M │- │M │CP│CP│M │CP│CP│                              │
├───────────┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──────────────────────────────┤
│                    https://stackoverflow.com/a/385491/36866                     │
└─────────────────────────────────────────────────────────────────────────────────┘

注意关于Chrome 6.0.472:如果你做一个强制重载(如CTRL-F5),它的行为就像url是内部标记,总是做一个强制重载。进入地址栏后,按“enter”键将清除该标志。


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

当用户点击CTRL-F5甚至然后新的请求去web服务器并得到响应。但是这一次,当解析响应头时,它不会在缓存中检查任何必需的信息,只从服务器中带来所有更新的信息。


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

因此,如果您想知道为什么浏览器总是在自动刷新Ajax站点上下载几百次相同的小图标,这是因为您最初使用CTRL-F5加载页面。


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

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


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