2012-02-17 30 views
8

Làm cách nào để ngăn trình duyệt của khách hàng hiển thị phiên bản được lưu trong bộ nhớ cache của một trang, vì vậy nó luôn phải thực hiện GET khi khách truy cập truy cập trang?Trình duyệt tiếp tục hiển thị phiên bản được lưu trong bộ nhớ cache của nó. Tôi muốn luôn luôn buộc GET

Tôi đang sử dụng trang trí @never_cache của Django trong chế độ xem, có thêm "Cache-Control: max-age = 0" vào tiêu đề HTTP GET. Tuy nhiên khi tôi truy cập trang (trong Google Chrome và Firefox, các trình duyệt duy nhất mà tôi đã thử nghiệm cho đến nay), phiên bản được lưu trong bộ nhớ cache chắc chắn được hiển thị. (Xác nhận bằng cách truy cập vào tab Network cho yêu cầu, trong đó báo cáo "200 OK (từ bộ nhớ cache)".)

Nếu tôi bây giờ click vào nút Refresh, nó sẽ làm cho tươi nội dung từ máy chủ (Network tab cho yêu cầu cho biết "200 OK" và các tiêu đề như được hiển thị bên dưới.)

Thay cho cài đặt "Cache-Control: max-age = 0" Tôi cũng đã thử đặt tham số tiêu đề HTTP "Hết hạn" thành là một ngày trong quá khứ. Cái này cũng không làm việc.

Request Method:GET 
Status Code:200 OK 

Request Headers 
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3 
Accept-Encoding:gzip,deflate,sdch 
Accept-Language:en-US,en;q=0.8 
Cache-Control:max-age=0 
Connection:keep-alive 
If-Modified-Since:Fri, 17 Feb 2012 15:25:21 GMT 
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11 

Response Headers 
Cache-Control:max-age=0 
Connection:keep-alive 
Content-Encoding:gzip 
Content-Type:text/html; charset=utf-8 
Date:Fri, 17 Feb 2012 15:55:11 GMT 
ETag:"[removed]" 
Expires:Fri, 17 Feb 2012 15:55:11 GMT 
Last-Modified:Fri, 17 Feb 2012 15:55:11 GMT 
Server:nginx 
Transfer-Encodindg:chunked 
Vary:Cookie,Accept-Encoding 
X-Handled-By:127.0.0.1:8000 
+0

Có sử dụng "no-cache" để thay thế sửa chữa vấn đề? Xem ở đây: http://stackoverflow.com/questions/1046966/whats-the-difference-between-cache-control-max-age-0-and-no-cache không chắc chắn làm thế nào để thiết lập mà từ Django mặc dù. –

+0

Tôi chưa thử điều đó. Làm như vậy ngay bây giờ ... – ram1

+0

Điều đó không hiệu quả, Graham. Tôi đặt tiêu đề Cache-Control thành "no-cache" và Chrome vẫn cung cấp phiên bản được lưu trong bộ nhớ cache của trang, ngăn chặn yêu cầu GET. Một lần nữa, tôi có thể nhấp vào nút Làm mới của Chrome vào thời điểm này để nhận nội dung mới - nhưng dĩ nhiên tôi muốn ngăn người dùng phải thực hiện điều đó. – ram1

Trả lời

11

Trong trả lời của bạn thiết lập các:

response['Cache-Control'] = 'no-cache, no-store, max-age=0, must-revalidate' 
response['Expires'] = 'Fri, 01 Jan 2010 00:00:00 GMT' 

Đó là cách Google Documents thi hành trang làm mới bất cứ lúc nào.

Sau đó, bạn có thể chơi với nó để tìm ra hành vi lý tưởng cho mục đích của mình.

+1

Tuyệt vời, cảm ơn bạn! – ram1

+1

Tôi có thể thấy rằng điều này đang buộc Chrome yêu cầu trang từ máy chủ của tôi, nhưng có vẻ như nó không hiển thị HTML được trả lại. Cụ thể, tôi có một giá trị được thêm vào thuộc tính khi lưu. Khi tôi nhấn nút quay lại, tôi thấy rằng chrome đã yêu cầu lại trang, nhưng khi tôi kiểm tra phần tử, giá trị không được thêm. Tuy nhiên, khi tôi xem nguồn, tôi thấy rằng giá trị đã được thêm chính xác vào phần tử. Trên Firefox mọi thứ đều hoạt động bình thường. – wildehahn

+0

@wildehahn Firefox hoạt động hơi khác một chút - nó hỗ trợ bộ đệm ẩn lùi. Không chắc chắn vấn đề là gì ở đây nhưng có lẽ bf cache gây ra sự khác biệt mà bạn quan sát. –

1

Bạn đã thử điều này trong tập tin htaccess của bạn:

<FilesMatch "\.(css|gif|html|jpg|js|php|png)$"> 
Header set Cache-Control: "max-age=0, no-store" 
</FilesMatch> 

Bạn có thể điều chỉnh dòng file phù hợp cho một trang/đường dẫn cụ thể và cũng có thể đối với tài sản cụ thể

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