愚人节的恼人浏览器缓存拒绝清除。

5
我花了周末时间编写了一个愚人节玩笑,但它还不完全按照我的意愿工作。
我有一个基于Drupal 6的网站,希望尽可能少地更改它。我的想法是将从 /files 目录提供的所有图像重定向到外部 Web 服务器(myserver),该服务器将图像翻转并将其提供给浏览器。
为了使 Drupal 网站(targetserver)将所有图像请求重定向到另一台服务器,我设置了一个 .htaccess 如下:
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_USER_AGENT} !^aprilFool$
RewriteRule ^(.*)$        http://myserver/aprilFool/?url=http://targetserver/files/$1 [R=302,L]

到目前为止它表现得非常好!当我启用所有功能时,愚人节玩笑会改变一些图片,并在客户端浏览器中显示。

但是当我禁用.htaccess@targetserver时,我的浏览器拒绝意识到这只是一个临时的玩笑,并忘记了编辑后的图片 :(

这里是我服务器上/aprilFool的Perl脚本片段:

my $ua = LWP::UserAgent->new;
# Identify ourselves through the useragent, to prevent endless redirect loops
$ua->agent( 'aprilFool' );

# Load remote file
my $response = $ua->get( $url );
if ( $response->is_error ) { die "Cannot retrieve document $url\n"; }
my $imageData = $response->content;


# Determine the file's mime type, need that to determine if we want to change it or not
my $ft = File::Type->new();
my $format = $ft->mime_type( $imageData );

# If the file is an image, flip it
if ( $format =~ m/^image\// ) {
        my $image=Image::Magick->new;
        $image->BlobToImage( $imageData );
        $image->Flip();
        $imageData = $image->ImageToBlob();
}

# Send HTTP headers
print "Content-type:$format\r\n";
print "\r\n";
print $imageData;

我尝试了以下方法但都没有成功:
  1. 在脚本中添加一个额外的头部:print "Cache-Control: max-age=36\r\n";
  2. 在 .htaccess 文件中 @targetserver 添加一行:Header set Expires "Mon Mar 12 15:45:00 CET 2012"
  3. 通过更改 .htaccess @myserver 中的 RewriteRule 将 image.jpg 的名称更改为 tmp-image.jpg,image.jpg.tmp 等多种方式。
但是在禁用 .htaccess 后,目标服务器仍然发送 304 =>“未修改”,直到我手动清除浏览器缓存才能解决。
所以我的问题是:我如何使愚人节只持续一天,最好持续到午夜... 我如何让浏览器意识到一旦玩笑结束就必须重新加载原始图像?

难道你的意思不是 Mon Mar 12 2012 15:45:00 CET 吗?请参考 http://blog.ellisons.org.uk/article-58 了解有关默认值的讨论。它们可能不是你所期望的 :-) - TerryE
尝试使用正确的时间格式使用过期标头,但似乎也不起作用。 - jippie
另一方面,我在Firefox中发现了about:cache?device=disk,它基本上显示了缓存中所有文件及其到期日期/时间。这证明了Cache-Control头部是有效的。要让Firefox过期图像,需要使用一个新的/干净的选项卡。 - jippie
即使您未指定“过期时间”,大多数浏览器也会假设默认缓存期为年龄的10%(现在-上次修改)。最安全的方法是强制不缓存。 - TerryE
是的,但默认的到期时间大约是半年左右。我记不太清了,但对于这样一个小玩笑来说,这个时间太长了。感谢您的帮助,TerryE! - jippie
2个回答

2

这是一个有趣的问题 :-)

当不是愚人节时,只需禁用重定向即可。302不会被浏览器缓存。

RewriteCond %{TIME_DAY} ^1$
RewriteCond %{TIME_MON} ^3$
RewriteCond %{HTTP_USER_AGENT} !^aprilFool$
RewriteRule ^(.*)$        http://myserver/aprilFool/?url=http://targetserver/files/$1 [R=302,L]

您需要检查值1和3是否正确匹配4月1日,但我认为TIME_MON是0-11,TIME_DAY是1-31。


这个想法是手动更改 .htaccess 文件,但这是一个聪明的小添加,使我的生活更加轻松!我还有几天时间来尝试这个:o) 谢谢! - jippie
创建了一个小的Perl脚本和相应的.htaccess文件来检查TIME_MON,但似乎您对月份有误。这是我几分钟前收到的输出(2012年3月14日星期三11:23:02 CET):TIME:20120314112302 TIME_DAY:14 TIME_HOUR:11 TIME_MIN:23 TIME_MON:03 TIME_SEC:02 TIME_WDAY:3 TIME_YEAR:2012 - jippie
好的,谢谢你分享你的结果。所以将 ^3$ 改为 ^04$,将 ^1$ 改为我认为是 ^01$ 或者,因为我不确定前导零,可以改为 ^0?1$ - Gerben
如果你没有提到它,我肯定会被前导零咬住 :) 这些日子必须进行夜间检查以确保一切正常。基本上这是我用来解决问题的技巧:RewriteRule (.*) apacheServerVariables/?TIME_DAY=%{TIME_DAY}&TIME_MON=%{TIME_MON} ... 再加上一个输出URI的小脚本。所以我对前导0非常确定。 - jippie
Apache文档似乎缺少有关这些变量的相关信息。我能找到的唯一一件事是用法语写的,而且没有提到前导零;http://httpd.apache.org/docs/2.3/expr.html:'-( - Gerben

0

原来是浏览器问题。关闭标签页,重新打开一个新的标签页可以清除旧的图片。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接