问题:我似乎无法让FireFox缓存从动态服务器发送的图像
设置:静态Apache服务器,在后端具有反向代理到动态服务器(mod_perl2).
这是服务器的请求URL.它被发送到动态服务器,其中cookie用于验证对映像的访问:
请求标题
Host: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: 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: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: Cookie: pz_cred=4KCNr0RM15%2FJCOt%2BEa6%2BL62z%2Fxvbp2xNQHY5pJw5d6Q Cache-Control: max-age=0
似乎请求不应该发生,因为浏览器应该缓存图像.实际上,接收到200响应,与第一个相同,并且图像似乎被重新获取(尽管浏览器似乎确实使用了高速缓存的图像).
上面的重载请求标头中的Cache-Control:max-age = 0似乎暗示了这个问题.
有谁知道为什么会这样?也许是响应中的Via标头导致问题?
原始请求有
Cache-Control: no-cache
它告诉所有中间HTTP缓存(包括Firefox)您不想使用缓存响应,您希望从原始Web服务器本身获取响应.
回复说:
Cache-Control: public, max-age=31536000
它告诉大家,只要原始服务器而言,响应可以被缓存.服务器似乎配置为允许缓存PNG图像:HTTP 1.1(第14.21节)说:
注意:如果响应包含带有max-age指令的Cache-Control字段(请参阅第14.9.3节),则该指令将覆盖Expires字段.
你的第二个请求说:
Cache-Control: max-age=0
它告诉所有中间HTTP缓存,你不会采用任何超过0秒的缓存响应.
需要注意的一件事是:如果您点击Firefox中的重新加载按钮,则要求从原始Web服务器重新加载.要测试图像的缓存,请离开页面并返回,或在新选项卡中打开它.不知道为什么你第一次看到no-cache而max-age = 0则是第二次.
顺便说一下,我喜欢Firefox的FireBug插件.您可以查看请求和响应标头以及各种其他好东西.