Browser 浏览器缓存控制,动态内容

Browser 浏览器缓存控制,动态内容,browser,mod-perl2,cache-control,Browser,Mod Perl2,Cache Control,问题:我似乎无法让FireFox缓存从动态服务器发送的图像 设置:静态Apache服务器,带有后端动态服务器(mod_perl2)的反向代理 这是服务器的请求URL。它被发送到动态服务器,其中cookie用于验证对映像的访问: 请求标题 Host: <OBSCURED> User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.15) Gecko/2009102815 Ubuntu/9.04 (jaunty) Fir

问题:我似乎无法让FireFox缓存从动态服务器发送的图像

设置:静态Apache服务器,带有后端动态服务器(mod_perl2)的反向代理

这是服务器的请求URL。它被发送到动态服务器,其中cookie用于验证对映像的访问:

请求标题

Host:  <OBSCURED>
User-Agent:  Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.15) Gecko/2009102815 Ubuntu/9.04 (jaunty) Firefox/3.0.15
Accept:  image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset:  ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive:  300
Connection:  keep-alive
Referer: <OBSCURED>
Cookie:  pz_cred=4KCNr0RM15%2FJCOt%2BEa6%2BL62z%2Fxvbp2xNQHY5pJw5d6Q
Pragma:  no-cache
Cache-Control: no-cache
Date:  Tue, 24 Nov 2009 04:28:07 GMT
Server:  Apache/2.2.11 (Ubuntu) mod_apreq2-20051231/2.6.0 mod_perl/2.0.4 Perl/v5.10.0
Cache-Control: public, max-age=31536000
Content-Length:  25496
Content-Type:  image/jpeg
Via: 1.1 127.0.1.1:8081
Keep-Alive:  timeout=15, max=75
Connection:  Keep-Alive
Host: <OBSCURED>
User-Agent:  Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.15) Gecko/2009102815 Ubuntu/9.04 (jaunty) Firefox/3.0.15
Accept:  image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset:  ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive:  300
Connection:  keep-alive
Referer: <OBSCURED>
Cookie:  pz_cred=4KCNr0RM15%2FJCOt%2BEa6%2BL62z%2Fxvbp2xNQHY5pJw5d6Q
Cache-Control: max-age=0
到目前为止,一切都很好(我认为)。但是,在重新加载页面时,图像不会显示为缓存,并再次发送请求:

请求标题

Host:  <OBSCURED>
User-Agent:  Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.15) Gecko/2009102815 Ubuntu/9.04 (jaunty) Firefox/3.0.15
Accept:  image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset:  ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive:  300
Connection:  keep-alive
Referer: <OBSCURED>
Cookie:  pz_cred=4KCNr0RM15%2FJCOt%2BEa6%2BL62z%2Fxvbp2xNQHY5pJw5d6Q
Pragma:  no-cache
Cache-Control: no-cache
Date:  Tue, 24 Nov 2009 04:28:07 GMT
Server:  Apache/2.2.11 (Ubuntu) mod_apreq2-20051231/2.6.0 mod_perl/2.0.4 Perl/v5.10.0
Cache-Control: public, max-age=31536000
Content-Length:  25496
Content-Type:  image/jpeg
Via: 1.1 127.0.1.1:8081
Keep-Alive:  timeout=15, max=75
Connection:  Keep-Alive
Host: <OBSCURED>
User-Agent:  Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.15) Gecko/2009102815 Ubuntu/9.04 (jaunty) Firefox/3.0.15
Accept:  image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset:  ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive:  300
Connection:  keep-alive
Referer: <OBSCURED>
Cookie:  pz_cred=4KCNr0RM15%2FJCOt%2BEa6%2BL62z%2Fxvbp2xNQHY5pJw5d6Q
Cache-Control: max-age=0
主机:
用户代理:Mozilla/5.0(X11;U;Linux i686;en-US;rv:1.9.0.15)Gecko/2009102815 Ubuntu/9.04(jaunty)Firefox/3.0.15
接受:image/png,image/*;q=0.8,*/*;q=0.5
接受语言:en-us,en;q=0.5
接受编码:gzip,deflate
接受字符集:ISO-8859-1,utf-8;q=0.7,*;q=0.7
活命:300
连接:保持活力
推荐人:
Cookie:pz_cred=4KCNr0RM15%2FJCOt%2BEa6%2BL62z%2Fxvbp2xNQHY5pJw5d6Q
缓存控制:最大年龄=0
请求似乎不应该发生,因为浏览器应该缓存图像。实际上,接收到与第一个相同的200响应,并且图像似乎被重新获取(尽管浏览器似乎正在使用缓存的图像)

这个问题似乎是由缓存控件暗示的:上面的重新加载请求头中的max age=0


有人知道为什么会这样吗?可能是响应中的Via头导致了问题?

原始请求

Cache-Control: no-cache
它告诉所有中间HTTP缓存(包括Firefox)您不想使用缓存响应,而是希望从源web服务器本身获取响应

答复说:

Cache-Control: public, max-age=31536000
它告诉每个人,就源服务器而言,响应可能会被缓存。服务器似乎配置为能够缓存PNG图像:(第14.21节)说明:

注意:如果响应包括 具有最大年龄的缓存控制字段 指令(见第14.9.3节),即 指令重写Expires字段

你的第二个要求是:

Cache-Control: max-age=0
它告诉所有中间HTTP缓存,您不会接受任何早于0秒的缓存响应

需要注意的一件事是:如果在Firefox中点击“重新加载”按钮,您将请求从源web服务器重新加载。要测试图像的缓存,请离开页面并返回,或者在新选项卡中打开它。不知道为什么第一次看到没有缓存,第二次看到max age=0

顺便说一句,我喜欢Firefox的FireBug插件。您可以使用它和其他各种好东西查看请求和响应标题。

看起来像是:

  • 已通过标头删除代理
  • 添加了上次修改的标题
  • 添加了一个遥远的未来到期日期
Firebug仍然显示来自源服务器的200个响应,但是,YSlow将图像识别为缓存。根据YSlow,刷新时的总图像下载大小大于500K;缓存已启动时,它显示0K下载大小

下面是来自原始服务器的响应头,它执行以下操作:

Date: Tue, 24 Nov 2009 08:54:24 GMT
Server: Apache/2.2.11 (Ubuntu) mod_apreq2-20051231/2.6.0 mod_perl/2.0.4 Perl/v5.10.0
Last-Modified: Sun, 22 Nov 2009 07:28:25 GMT
Expires: Tue, 30 Nov 2010 19:00:25 GMT
Content-Length: 10883
Content-Type: image/jpeg
Keep-Alive: timeout=15, max=89
Connection: Keep-Alive
因为我请求图像的方式,如果这些日期是静态的,这真的不重要;我的应用程序知道请求图像之前的最后一次修改时间,并将其附加到客户端的请求URL,以便为每个图像版本创建唯一的URL,例如(信息来自AJAX JSON提要)。例如,我可以将最后一次修改日期定为2000年1月1日,到期日期定为2050年


如果YSlow是正确的——性能测试表明它是正确的——那么FireBug应该真正报告这些本地缓存命中,而不是200次响应。

我之前的回答只是部分正确。

问题在于Firefox3处理重载事件的方式。显然,它几乎总是再次从源服务器请求内容。因此,
缓存控制:max age=0
请求头

Firefox确实使用缓存图像在重新加载时呈现页面,但它仍然会“在后台”发出所有更新请求。然后,当它们进入时,它将替换它们

因此,页面呈现速度很快,YSlow报告缓存的内容。但是服务器仍然被钉住了

解决方案是询问动态服务器脚本中的传入标头,并确定是否提供了“if Modified Since”标头。如果是这种情况,并且确定内容没有更改,则返回HTTP_not_MODIFIED(304)响应

这不是最优的——我宁愿Firefox根本不发出请求——但它将页面加载时间缩短了一半,并大大降低了带宽。考虑到Firefox在重新加载时的工作方式,这似乎是最好的解决方案

其他评论:Jim Ferran关于导航离开页面并返回的观点有其优点——缓存总是被使用,并且没有请求传出(+1到Jim)。此外,动态添加的内容(例如初始加载后的AJAX调用)似乎也使用缓存


希望这对我以外的人有帮助:)

嗨,吉姆:谢谢你的帮助!当我按下shift reload时,第一个请求来自Firefox。这似乎是合适的,因为我明确要求“新鲜”的内容。第一个回答似乎也是正确的;它具有预期的标题。第二个请求发生在浏览器重新加载/不加载/移位时。我们期望firefox缓存会遵守第一个响应,例如max age=31536000。看起来服务器说所有图像(image/*)都可以缓存。如果所有这些都是正确的,那么问题是什么让FireFox忽略缓存指令?我应该补充,FireFox中启用了缓存,并且它成功地缓存了来自静态服务器的图像。我有肌萎缩侧索硬化症