2011-08-30 27 views
9

Trình duyệt: Firefox 6.0Làm thế nào để ngăn chặn nội dung được hiển thị từ bộ nhớ đệm Back-Forward trong Firefox?

Tôi đã Trang A với các thiết lập sau đây để đảm bảo nội dung không được lưu trữ trong bfcache của trình duyệt:

1) $(window).unload(function(){});

2) Tiếp theo Tiêu đề HTTP:

<meta http-equiv="pragma" content="no-cache" /> 
<meta http-equiv="expires" content="-1" /> 
<meta http-equiv="cache-control" content="no-cache"/> 

Tôi cũng đã kết nối các sự kiện pagehidepageshow. Khi tôi đang điều hướng khỏi trang, pagehide được gọi với giá trị ĐÚNG cho các tài sản sự kiện persisted = false (đó là những gì cần thiết: không kiên trì trong bộ nhớ cache)

Sau khi điều hướng một vài trang, tôi đã là một window.history.go(-2); đi trở lại trang A. Tại thời điểm này, tôi muốn Firefox thăm dò ý kiến ​​máy chủ cho phiên bản cập nhật thay vì hiển thị từ bộ nhớ cache. pageshow của Trang A được gọi với giá trị CORRECT cho thuộc tính sự kiện persisted = false (có nghĩa là trang KHÔNG được tải từ bộ nhớ cache). NHƯNG nội dung trang không phải là dữ liệu máy chủ; nó là nội dung cũ (giống như khi điều hướng khỏi trang ban đầu)! Fiddler cũng không hiển thị yêu cầu mới cho máy chủ.

Google Chrome cũng thể hiện hành vi tương tự. IE hoạt động như mong đợi (tải lại dữ liệu mới)!

Bất kỳ ý tưởng nào tôi bị thiếu?

Cảm ơn trước!

Trả lời

9

Có nhiều bộ nhớ cache liên quan. Có bộ nhớ cache tài liệu của trình duyệt (bfache), bộ nhớ cache HTTP của trình duyệt và các bộ đệm HTTP trung gian.

Thẻ <meta> bạn hiển thị ở trên hoàn toàn không có hiệu lực trong Chrome hoặc Firefox hiện tại. Chúng có thể có hiệu lực trong IE.

Cơ hội là, trang của bạn vừa được đọc từ bộ nhớ cache HTTP của trình duyệt.

Nếu bạn thực sự muốn gửi tiêu đề HTTP không có bộ nhớ cache, bạn nên làm điều đó. Nhưng chúng cần phải là các tiêu đề HTTP thực tế: như tôi đã nói ở trên, thẻ "tương đương" <meta> không làm gì cả.

Và quan trọng là mọi bộ đệm trung gian khác sẽ không phân tích cú pháp HTML của bạn để có thể lưu vào bộ nhớ cache nếu bạn không gửi đúng tiêu đề HTTP.

+6

Cảm ơn! Các tiêu đề HTTP sau đây đã có sẵn: 'Bộ nhớ cache-kiểm soát: no-cache Pragma: no-cache Hết hạn: -1' Thật không may là chúng cũng không hỗ trợ. Sau khi trả lời của bạn, tôi xem xét lại các tiêu đề và thấy rằng Firefox cần một tiêu đề khác để ngăn chặn bộ nhớ đệm: http://blog.httpwatch.com/2008/10/15/two-important-differences-between-firefox-and-ie-caching/ 'Bộ nhớ cache-kiểm soát: không có bộ nhớ cache, không lưu trữ ' Sau khi thêm tiêu đề ở trên, nó bây giờ hoạt động OK trong IE, Firefox, Chrome & Safari. Chỉ Opera vẫn hoạt động sai trong bộ nhớ đệm, nhưng tôi sẽ trì hoãn vấn đề đó tạm thời. – Venkat

+0

Lưu ý khác: Firefox không lưu trữ trong bfcache nếu trang web được bật SSL! Hệ thống sản xuất của tôi là SSL trong khi hệ thống DEV thì không. Vì vậy, hệ thống sản xuất hoạt động tốt trong Firefox KHÔNG có bất kỳ tiêu đề HTTP bổ sung nào như tiêu đề đã đề cập ở trên! – Venkat

+0

Tùy thuộc vào tiêu đề HTTP của bạn. SSL + no-cache sẽ không được lưu trữ trong bfcache, nhưng SSL có thể lưu trữ được. –

2

Câu trả lời dưới đây không làm việc nữa:

Từ answer on SO, thêm một sự kiện unload để cửa sổ gây ra phía sau/phía trước bộ nhớ cache để bị xóa.

CẬP NHẬT. GIẢI PHÁP KHẢ NĂNG:

BFCache có thể gây bất ngờ cho các nhà phát triển, vì ít nhất trong Firefox khi di chuyển trở lại/chuyển tiếp trang không làm mới ngay cả khi nó được thông báo bởi tiêu đề HTTP. Vì vậy, tốt hơn nên giả sử rằng trang sẽ không làm mới.

Mặt khác, sự khác nhau giữa việc nhận trang với dữ liệu lỗi thời vì BFCache là gì và tìm một tab trong trình duyệt mà bạn không tải lại cho các độ tuổi?

Nếu bạn quan tâm đến những điều đó, hãy viết một số javascript kiểm tra máy chủ để cập nhật và tải lại thông tin nhạy cảm. Đây là cơ hội để biến vấn đề của bạn thành chiến thắng).

+0

back/forward cache === bfcache – Dan

+1

Tôi không thể bfcache không hợp lệ bằng cách thêm 'unload' event vào cửa sổ như' window.onunload = function() {console.log ('cho phép dỡ bỏ các cửa sổ');} '. Bạn có thể cụ thể hơn một chút về cách làm điều đó không? Cảm ơn rất nhiều. – Simon

+0

Tôi đã thử mẫu tại http://www.jakearchibald.com/jsperformance/backforwardcache/ và hóa ra nó cũng không hoạt động. – Simon

1

Nếu bạn đặt Cache-Control: "no-cache, no-store, must-revalidate" thành tiêu đề http, trang này sẽ không được lưu trong bộ đệm ẩn trong bộ đệm ẩn.

Firefox cũng sẽ xem xét xử lý sự kiện trên beforeunload sự kiện như một tín hiệu để không lưu trữ trang trong BFC, nhưng Safari bỏ qua xử lý như vậy, do đó, nó tốt hơn để thiết lập tiêu đề http đúng để chỉ ra bản chất của nội dung trang (cache hoặc biến)

+0

Cảm ơn bạn rất nhiều, bạn đã lưu tôi sau 3 ngày nghiên cứu! –

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