Http Chrome-为什么它会发送自请求的修改?

Http Chrome-为什么它会发送自请求的修改?,http,caching,google-chrome,if-modified-since,Http,Caching,Google Chrome,If Modified Since,我有一个有很多小图片(图标)的页面。当与chrome一起使用时,每次重新加载页面时,chrome都会使用if-modified-since头从服务器请求每个图标 所有图标都带有expires和max age标题。Firefox从缓存中加载图像 为什么chrome会这样做?我如何防止它 谢谢这听起来像是在试图通过询问服务器自上次请求图像后图像是否已更改来避免过时的缓存。听起来是件好事,而不是你想阻止的事情。现代浏览器的缓存行为越来越复杂和智能化。通读一些例子和更多细节 正如Florian所说,不要

我有一个有很多小图片(图标)的页面。当与chrome一起使用时,每次重新加载页面时,chrome都会使用if-modified-since头从服务器请求每个图标

所有图标都带有expires和max age标题。Firefox从缓存中加载图像

为什么chrome会这样做?我如何防止它


谢谢

这听起来像是在试图通过询问服务器自上次请求图像后图像是否已更改来避免过时的缓存。听起来是件好事,而不是你想阻止的事情。

现代浏览器的缓存行为越来越复杂和智能化。通读一些例子和更多细节


正如Florian所说,不要反对:-)

Chrome inspector的一个快速实验表明,只有在重新加载页面时才会发生这种情况,而不是在正常加载页面时。Chrome正在尝试刷新缓存。想想看——如果你将
过期
最长期限
设置为几十年,你是否要求浏览器缓存该资源,而从不检查它是否得到更新?它尽可能地缓存资源,但当页面需要刷新时,它希望确保刷新整个页面。其他浏览器当然也会这样做(尽管有些浏览器可以选择刷新前等待的小时数)

多亏了现代浏览器和服务器,刷新大量图标的速度不会像您想象的那么慢-请求通过管道传输以消除多次往返延迟,如果修改
,则
头的全部目的是允许服务器比较时间戳并返回“未修改”状态代码。对于页面所需的每个资源,都会发生这种情况,但浏览器将能够一次发出所有请求,并验证所有请求均未更改

也就是说,您可以做一些事情来简化此过程:

  • 在Chrome的inspector中,使用resources选项卡查看它们是如何加载的。如果没有请求头,则直接从缓存加载资源。如果看到
    304未修改
    ,则资源已刷新,但无需再次下载。如果您看到
    200 OK
    ,它又被下载了

  • 在Chrome的inspector中,使用audits选项卡查看它对资源可缓存性的看法,以防某些缓存头不是最佳的

  • 所有这些
    如果进行修改,因为
    请求和304个响应可以相加,即使它们只包含标题。将图像合并到精灵中以减少请求数量


  • 假设您正在运行Apache,您可以尝试显式地为文件系统中的某些文件类型和/或位置设置缓存生存期

    
    
    标题集缓存控制“最大年龄=604800,公共”#7天

    或者类似的

    
    过期按类型图像/jpeg“访问加7天”
    ExpiresByType image/gif“访问加7天”
    ExpiresByType image/png“访问加7天”

    通常,我会在一个目录中按用途对文件类型进行分组,并相应地设置生存期


    浏览器在过期之前不应该请求文件,但可能并不总是遵守。您可能希望/需要使用上次修改的标题和ETag标题。网上有很多关于这方面的好信息。

    如果RFC规定的日期无效,Google Chrome将忽略
    Expires
    标题。例如,始终需要将天指定为两位数。5月1日应设置为“5月1日”(而不是“5月1日”),以此类推。Firefox接受它们,这会误导用户问题出在浏览器(本例为Chrome),而不是标题值本身


    因此,如果您手动设置过期日期(不使用
    mod_expires
    或类似于计算实际日期的方法),我建议您使用检查静态文件头。

    是否检查了请求头

    “无论您是按enter、f5还是ctrl+f5,“Cache-Control”始终设置为“max age=0”。除非您启动Chrome并输入url,然后按enter。”


    使用chrome,无论是刷新页面还是仅仅访问页面都很重要

    刷新时,chrome将为每个文件ping服务器,无论它们是否已缓存。如果文件未被修改,您应该会看到304未修改响应。如果文件已被修改,您将看到一个200 OK响应


    不刷新时,缓存文件的状态将为200 OK,但如果您查看网络面板的“大小/内容”列,您将看到(来自缓存)

    。。。我对服务器收到许多不必要的请求并同时破坏用户体验并不感到兴奋。无论如何,谢谢你有趣的阅读。我真的对这一切感到困惑。当然,刷新应该检查新内容,听起来不错。但chrome也会发送这些正常页面加载请求。更让人困惑的是,现在的行为似乎突然改变了,从缓存中提取图像时没有任何if-modified请求。我没有改变任何东西,因为我讨厌这样不确定的系统。@user就我所知,这是正确的行为。Andy关于IE的链接描绘了一幅类似的画面——假设缓存头正确,在会话中的第一次,总是检查资源是否有更新,之后总是缓存,直到请求重新加载。我知道这不是很简单,也许我能说的最好的一点是,编写浏览器、代理和服务器的人在这方面投入的时间比你我都多。我相信他们的判断。谢谢,这回答了我的一个问题。标题行上的“7天”评论导致