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

Mic*_*ski 3 browser cache-control mod-perl2

问题:我似乎无法让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
Run Code Online (Sandbox Code Playgroud)

动态服务器将图像流回服务器,并提供以下响应:

响应标题

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
Run Code Online (Sandbox Code Playgroud)

到目前为止,这么好(我认为).但是,在重新加载页面时,图像不会显示为缓存,并再次发送请求:

请求标题

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
Run Code Online (Sandbox Code Playgroud)

似乎请求不应该发生,因为浏览器应该缓存图像.实际上,接收到200响应,与第一个相同,并且图像似乎被重新获取(尽管浏览器似乎确实使用了高速缓存的图像).

上面的重载请求标头中的Cache-Control:max-age = 0似乎暗示了这个问题.

有谁知道为什么会这样?也许是响应中的Via标头导致问题?

Jim*_*ans 5

原始请求有

Cache-Control: no-cache
Run Code Online (Sandbox Code Playgroud)

它告诉所有中间HTTP缓存(包括Firefox)您不想使用缓存响应,您希望从原始Web服务器本身获取响应.

回复说:

Cache-Control: public, max-age=31536000
Run Code Online (Sandbox Code Playgroud)

它告诉大家,只要原始服务器而言,响应可以被缓存.服务器似乎配置为允许缓存PNG图像:HTTP 1.1(第14.21节)说:

注意:如果响应包含带有max-age指令的Cache-Control字段(请参阅第14.9.3节),则该指令将覆盖Expires字段.

你的第二个请求说:

Cache-Control: max-age=0
Run Code Online (Sandbox Code Playgroud)

它告诉所有中间HTTP缓存,你不会采用任何超过0秒的缓存响应.

需要注意的一件事是:如果您点击Firefox中的重新加载按钮,则要求从原始Web服务器重新加载.要测试图像的缓存,请离开页面并返回,或在新选项卡中打开它.不知道为什么你第一次看到no-cache而max-age = 0则是第二次.

顺便说一下,我喜欢Firefox的FireBug插件.您可以查看请求和响应标头以及各种其他好东西.