2012-03-12 32 views
5

Tôi đã dành cho chương trình cuối tuần của mình một trò đùa của April Fool, nhưng nó không hoạt động theo cách tôi muốn.Bộ nhớ cache trình duyệt gây phiền nhiễu của April fool từ chối tuôn ra

Tôi có trang web dựa trên Drupal 6 mà tôi muốn thay đổi ít nhất có thể. Ý tưởng là tất cả các hình ảnh được phục vụ từ thư mục/files được chuyển hướng đến một máy chủ web bên ngoài (myserver) để lật hình ảnh lộn ngược và sau đó đưa nó vào trình duyệt.

Để làm cho trang web Drupal (targetserver) chuyển hướng tất cả các yêu cầu về hình ảnh đến máy chủ khác, tôi thiết lập một .htaccess như sau:

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

Và cho đến nay nó hoạt động tuyệt vời! Khi tôi kích hoạt mọi thứ, thủ thuật của April Fool thay đổi một số hình ảnh và chúng được hiển thị trong trình duyệt của khách hàng.

Nhưng khi tôi vô hiệu hóa các @targetserver .htaccess, trình duyệt của tôi từ chối để nhận ra điều đó chỉ có nghĩa là trở thành một trò đùa tạm thời và quên đi những hình ảnh đã chỉnh sửa :(

Đây là một sniplet của kịch bản Perl trên myserver/aprilFool:

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; 

tôi đã thử những điều sau đây nhưng không thành công:

  1. Thêm một tiêu đề phụ trong kịch bản: print "cache-Control: max-age = 36 \ r \ n ";
  2. Thêm một dòng trong @targetserver .htaccess: Tiêu đề bộ Expires "Mon 12 Tháng Ba 15:45:00 CET 2012"
  3. Thay đổi tên cho image.jpg theo những cách khác nhau tmp-image.jpg, hình ảnh. jpg.tmp bằng cách thay đổi RewriteRule trong .htaccess @myserver

Nhưng sau khi vô hiệu hóa .htaccess, máy chủ đích tiếp tục gửi 304 => 'Không được sửa đổi' cho đến khi tôi xóa bộ nhớ cache của trình duyệt theo cách thủ công. Vì vậy, câu hỏi của tôi là: Làm thế nào tôi có thể làm cho ngày 01 tháng 4 cuối cùng chỉ một ngày, tốt nhất là cho đến nửa đêm ... Làm thế nào tôi có thể làm cho trình duyệt nhận ra nó phải tải lại hình ảnh ban đầu khi trò đùa kết thúc?

+0

Dont 'bạn có nghĩa là' Mon Mar 12 2012 15:45:00 CET'. xem http://blog.ellisons.org.uk/article-58 để thảo luận về các giá trị mặc định. Họ không phải là những gì bạn có thể mong đợi :-) – TerryE

+0

Đã thử tiêu đề hết hạn với định dạng thời gian chính xác, nhưng nó dường như không hoạt động. – jippie

+0

Mặt khác, tôi tìm thấy về: cache? Device = disk trong Firefox, về cơ bản hiển thị tất cả các tệp trong bộ nhớ cache và ngày/giờ hết hạn của chúng. Điều này chứng minh rằng tiêu đề Cache-Control * là * làm việc. Để Firefox hết hạn hình ảnh, tôi bắt buộc phải sử dụng một tab mới/sạch. – jippie

Trả lời

0

Nó bật ra được một vấn đề trình duyệt. Đóng tab, mở lại một tab mới đã xóa các hình ảnh cũ.

2

Đây là một câu hỏi thú vị :-)

Chỉ cần vô hiệu chuyển hướng khi nó không phải là ngày đầu tiên. 302 không được lưu trong trình duyệt.

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] 

Bạn sẽ phải kiểm tra xem các giá trị 1 và 3 là chính xác để phù hợp với tháng tư đầu tiên, nhưng tôi nghĩ TIME_MON là 0-11 và TIME_DAY là 1-31

+0

Ý tưởng là thay đổi tệp .htaccess theo cách thủ công, nhưng đây là một phần bổ sung tuyệt vời giúp cuộc sống của tôi trở nên dễ dàng hơn! Tôi có một vài ngày còn lại để thử nghiệm với điều này: o) Thnx! – jippie

+0

Đã tạo một tập lệnh perl nhỏ và kèm theo .htacces để kiểm tra TIME_MON, nhưng có vẻ như bạn đã sai về tháng. Đây là sản phẩm tôi đã vài phút trước (Wed Mar 14 11:23:02 CET 2012): TIME: 20120314112302 TIME_DAY: 14 TIME_HOUR: 11 TIME_MIN: 23 TIME_MON: 03 TIME_SEC: 02 TIME_WDAY : 3 TIME_YEAR: 2012 – jippie

+0

OK, cảm ơn bạn đã chia sẻ kết quả của mình. Vì vậy, thay đổi '^ 3 $' thành '^ 04 $' và '^ 1 $' để tôi nghĩ '^ 01 $' hoặc, vì tôi không chắc chắn về số 0 đứng đầu, '^ 0? 1 $'. – Gerben

Các vấn đề liên quan