首页 文章

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

提问于
浏览
378

F5和Ctrl F5在Web浏览器中触发的操作是否有标准?

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

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

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

6 回答

  • 288

    一般来说:

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

  • 9

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

    我测试过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"来添加对缓存控制的支持的浏览器 .

    Edit: 更新了表格

    下表更新了有关单击浏览器的刷新按钮(Joel Coehoorn请求之后)和"max-age=0" Cache-control-header时将发生的情况的信息 .

    Updated table, 27 September 2010

    ┌────────────┬───────────────────────────────────────────────┐
    │  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,除非它是我旧 table 上的拼写错误 .

    Note about Chrome 6.0.472 :如果执行强制重新加载(如CTRL-F5),则其行为类似于内部标记的url始终执行强制重新加载 . 如果您转到地址栏并按Enter键,该标志将被清除 .

  • 3

    我已经实现了跨浏览器兼容的页面来测试browser's refresh behavior并获得类似于@some的结果,但对于现代浏览器:

    enter image description here

  • 1

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

    因此,如果你是're wondering why the browser keeps downloading the same little icon a few hundred times on your auto-refresh Ajax site, it',因为你最初使用CTRL-F5加载页面 .

  • 515

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

    如果单击页面并按CTRL F5,则"Cache-Control: no-cache"将包含在请求标头中 . 如果单击位置/地址栏,然后按CTRL F5则不是 .

  • 67

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

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

相关问题