2010-08-06 17 views
5

Tôi có một trang mà một khi nút được nhấp vào, nó được thay thế bằng trình quay số Ajax trong khi người dùng đợi trang tiếp theo tải.Safari dường như bỏ qua cài đặt bộ nhớ cache khi người dùng truy cập lại bằng chuột hoặc bàn phím

Tôi đang kiểm soát (hoặc cố gắng kiểm soát) bộ nhớ đệm bằng .htaccess. Nếu người dùng truy cập lại (nút trình duyệt, nút chuột, alt + trái, backspace), nó cần phải tải lại trang từ bộ nhớ cache. IEs 6-8 và Chrome đều ổn với điều này. Firefox không hoạt động trong một thời gian và gần đây đã bắt đầu hoạt động, nhưng vấn đề dường như vẫn còn trong Safari. Điều này có vẻ hơi lạ, bởi vì tôi đã mong đợi Safari và Chrome cư xử theo cùng một cách.

Đây là tập tin .htaccess của tôi:

# Add Proper MIME-Type for Favicon 
AddType image/x-icon .ico 

<IfModule mod_expires.c> 
    ExpiresActive On 
# ExpiresDefault A2630000 
    ExpiresByType image/x-icon A2630000 
    ExpiresByType image/gif A2630000 
    ExpiresByType image/jpeg A2630000 
    ExpiresByType image/png A2630000 
    ExpiresByType application/x-javascript M2630000 
    ExpiresByType application/javascript M2630000 
    ExpiresByType text/css M2630000 
</IfModule> 

<IfModule mod_headers.c> 
    Header set Cache-Control "public" 
    <FilesMatch "\.php$"> 
     Header set Cache-Control "no-store, no-cache, must-revalidate, max-age=0, post-check=0, pre-check=0" 
    </FilesMatch> 
</IfModule> 

SetOutputFilter DEFLATE 

AddOutputFilterByType DEFLATE text/css 
AddOutputFilterByType DEFLATE application/javascript 

Tôi đã thử nó có và không có dòng nào Cache-Control.

Tôi cũng đã thử thêm:

AddType application/x-httpd-php .php 

với:

ExpiresByType application/x-httpd-php A0 

Để vô ích.

Tôi có thiếu thứ gì đó hiển nhiên không?

Chỉnh sửa: Tôi không nghĩ rằng nó liên quan đến cài đặt bộ nhớ cache.

Tôi đã cố gắng thêm này đến PHP bản thân:

#safari test 
if (strstr($_SERVER['HTTP_USER_AGENT'],'Safari')){ 
    header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1 
    header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past 
} 

Và thậm chí nếu không có những dòng tôi có thể nhìn thấy trong "kiểm tra nguyên tố"> nguồn lực mà các tiêu đề đúng đang được nhận. Vấn đề dường như là những gì Safari đang làm với họ trong nỗ lực của mình để trở thành "trình duyệt nhanh nhất". Nó sẽ xuất hiện mà nó rõ ràng bỏ qua những gì các nhà phát triển trang web cụ thể - điều này nghe giống như suy nghĩ ban đầu của IE từ trở lại trong ngày khi bảng nơi được sử dụng cho bố trí.

+1

Safari sẽ không hành động theo cùng một cách như Chrome về bộ nhớ đệm. Cả hai đều sử dụng cùng một công cụ kết xuất (WebKit), vì vậy họ sẽ hiển thị các trang, chạy tập lệnh, v.v. giống nhau, nhưng bộ nhớ đệm và các công cụ như vậy không được thực hiện bởi WebKit và có thể được Safari và Chrome xử lý khác nhau. – qmega

Trả lời

3

Thông số HTTP nói rõ ràng rằng việc thu hồi từ lịch sử (nút quay lại/tiến) không phải thực hiện xác thực bộ nhớ cache. Vì vậy, điều này có vẻ như hành vi hợp lệ.

+0

Đúng, đập bằng tiền. Đó là sau khi tất cả không phải là một vấn đề của bộ nhớ đệm (lưu trữ phản ứng để tái sử dụng cho các yêu cầu tiếp theo mà họ có giá trị) nhưng lịch sử. Nó có ý nghĩa rất ít để cố gắng thay đổi lịch sử. –

0

Tôi đã có một vấn đề tương tự với firefox nhưng sửa đổi .htaccess với mã ...

<IfModule mod_headers.c> 
    Header set Cache-Control "public" 
    <FilesMatch "\.php$"> 
     Header set Cache-Control "no-store, no-cache, must-revalidate, max-age=0, post-check=0, pre-check=0" 
    </FilesMatch> 
</IfModule> 

... đó, trớ trêu thay, bạn có trong mã của bạn, cố định nó cho tôi. Bạn không chắc chắn về vấn đề Safari.

0

Hãy thử thêm đây là một thẻ meta trong HTML của bạn:

<meta http-equiv="cache-control" content="no-cache, no store, must-revalidate"/> 
0

là Safari đem lại cho bạn 304 trong khi Chrome không? Nếu vậy, tôi nghi ngờ bạn đang sử dụng Apache 2.0 và nâng cấp lên Apache 2.2 giải quyết vấn đề này.

+0

Safari cung cấp trạng thái 200, cũng như Chrome. – bcmcfc

1

Hành vi này là do back-forward Cache. Bạn có thể nhấn vào sự kiện onpageshow để tìm hiểu thời điểm người dùng điều hướng bằng nút quay lại. Tìm tài sản có tên persisted. Nó được đặt thành false khi tải trang ban đầu. Tuy nhiên khi trang đến từ bfcache nó được đặt thành true.

Sau đó bạn có thể ép buộc tải lại trang với JavaScript:

window.onpageshow = function(event) { 
    if (event.persisted) { 
     window.location.reload(true) 
    } 
}; 

hoặc nếu bạn đang sử dụng jQuery:

$(window).bind("pageshow", function(event) { 
    if (event.originalEvent.persisted) { 
     window.location.reload(true) 
    } 
}; 
+0

Cảm ơn bạn! Đã làm cho tôi! – kstratis

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