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

413

F5Ctrl+F5 在网页浏览器中有一个标准行为吗?

我曾在IE6和Firefox 2.x做过实验。使用 F5 刷新会向服务器发送一个带有 If-Modified-Since 请求头的HTTP请求,而 Ctrl+F5 不会有这样的请求头。据我理解,F5 会尽可能利用缓存内容,而 Ctrl+F5 旨在放弃所有缓存的内容,只从服务器重新获取所有内容。

但今天,我注意到在一些最新的浏览器(Chrome、IE8)中,它们不再按照这种方式工作了。无论是 F5 还是 Ctrl+F5 都会发送带有 If-Modified-Since 请求头。

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


11
FWIW: 尽管这个话题确实可能适合超级用户讨论,而且最初提问时可能还有一定的终端用户关注度,但现在它已经被程序员和Web开发人员回答和引用,应该留在这里。 SU已经有其他几个更面向终端用户的类似话题版本了,不需要再添加这个。 - Shog9
4
https://xkcd.com/1854/ - sudo bangbang
我可能有点疯狂,但我认为 ALT+F5CTRL+F5 的作用是一样的。 - ashleedawg
根据我的研究(请参见我的回答中的表格),只有Opera 9会对ALT+F5做出反应,而其他所有经过测试的浏览器都会对CTRL+F5做出反应。这是在Windows上的情况。您使用的操作系统和浏览器是什么? - some
6个回答

534

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

F5 通常仅在页面被修改时更新页面。现代浏览器发送 Cache-Control: max-age=0 来告诉任何缓存资源相对于请求时间的最大新鲜期。

CTRL-F5 用于强制更新,无视任何缓存。现代浏览器发送 Cache-Control: no-cachePragma: No-cache

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

┌───────────┬──────────────┬─────┬─────────────────┬──────────────────────────────┐
│ 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://dev59.com/PHRC5IYBdhLWcg3wK96V#385491                     │
└─────────────────────────────────────────────────────────────────────────────────┘

关于Chrome 6.0.472的注意事项:如果你进行强制刷新(例如按下CTRL-F5),它会像将URL内部标记为始终进行强制刷新一样。如果你转到地址栏并按回车键,则该标记会被清除。


5
使用刷新按钮更新表格。 ASCII 图形表格很好用,不是吗?颜色编码只是代码颜色编码的一个副作用。 - some
11
你能不能把它做成一个规范的HTML表格? - John Topley
14
FYI - 这个答案实际上已经被引用在Chrome开发/错误跟踪版面上:http://code.google.com/p/chromium/issues/detail?id=1906 - Kip
20
抱歉,由于禁止使用表格,所以回答是否定的。 - some
5
@PaulIrish 十年后,这张表格已被更新。 :) - some
显示剩余7条评论

332

一般来说:

F5 可能会从缓存中加载页面,即使内容已更改,仍可能给您相同的页面。但是,Ctrl+F5 强制刷新缓存,并确保如果内容已更改,您将获得新内容。


93
这是准确的,但请注意,虽然Ctrl+F5会导致浏览器清除缓存并从服务器请求新的页面,但服务器可能会忽略no-cache头,并提供一个服务器端缓存的页面。因此,即使使用Ctrl+F5,如果服务器忽略no-cache头,则可能返回页面的旧版本。 - AaronLS
F5会刷新页面 - CTRL+F5将进行“硬”刷新。 - Dimitri Dewaele
另外请注意,如果给定了表单,Ctrl-F5将提交该表单。 - jawo
1
好的,如果你按下ctrl+f5,你告诉你的浏览器不要使用它的缓存,但是在后续请求同一页面时会发生什么呢?我的意思是,在看到最老版本之后,您是否可以看到旧版本的页面?如果我正在查看页面的版本1,因为它被缓存了,但已经有版本2可用,我知道按下ctrl+f5将使我看到版本2。然后我关闭浏览器并再次打开该页面,我会看到版本1还是仍然看到版本2?谢谢。 - molerus

70

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

enter image description here


你页面上的链接已经失效了,我修复了答案中的链接,但是该页面上很多链接都已经失效了。http://podlipensky.com/examples/refreshbutton/index.html,http://podlipensky.com/post/2012/02/27/How-to-check-if-browser-caching-disabled.aspx - Ruan Mendes
抱歉,正在进行博客迁移。链接将尽快修复,现在请前往 GitHub 存储库并下载示例。 - Pavel Podlipensky
链接仍然无法使用。迁移还未完成? - bernardn
请问 @PavelPodlipensky,您能否更新您的答案,特别是移动和桌面版 Safari 的当前版本? - Greg Dubicki

10

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

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


4

IE7/8/9在页面是否有焦点时表现不同。

如果你点击页面并使用 CTRL+F5,则请求头中会包含 "Cache-Control: no-cache"。如果你点击地址栏然后再按下 CTRL+F5,则不会包含该信息。


2
当用户按下 F5 键时,虽然会向 Web 服务器发送新请求并获取相应的响应。但是,当解析响应头时,它会检查浏览器缓存中的所需信息。如果缓存中的所需信息没有过期,则该信息将直接从缓存中恢复。
当用户点击 CTRL-F5 时,同样会向 Web 服务器发送新请求并获取响应。但是,这次解析响应头时不会检查缓存中的任何所需信息,并且只会从服务器上获取所有更新的信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接