愚人节烦人的浏览器缓存拒绝刷新

时间:2012-03-12 16:02:40

标签: apache .htaccess caching redirect flush

我花了我的周末编写一个小愚人节的笑话,但它不能按照我想要的方式工作。

我有一个基于Drupal 6的网站,我希望尽可能少地改变它。我们的想法是,从/ files目录提供的所有图像都被重定向到外部网络服务器(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时,我的浏览器拒绝意识到这只是一个临时的笑话而忘记了编辑过的图像:(

以下是myserver / 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: 最大年龄= 36 \ r \ n“个;
  2. 在.htaccess @targetserver中添加一行:标题设置过期“Mon Mar 12 15:45:00 CET 2012"
  3. 以各种方式更改image.jpg的名称tmp-image.jpg, image.jpg.tmp通过更改.htaccess @myserver
  4. 中的RewriteRule

    但是在禁用.htaccess之后,目标服务器继续发送304 =>在我手动刷新浏览器缓存之前,“未修改”。

    所以我的问题是:我怎样才能使4月1日最后一天,最好是直到午夜......如何让浏览器意识到一旦笑话结束就必须重新加载原始图像?

2 个答案:

答案 0 :(得分: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月,但我认为TIME_MON为0-11,TIME_DAY为1-31

答案 1 :(得分:0)

原来是一个浏览器问题。关闭标签,重新打开新标签会刷新旧图像。