2013-04-23 26 views
11

Mặc dù tôi gửi "kiểm soát bộ nhớ cache: phải xác thực lại" Google Chrome sử dụng trang được lưu trong bộ nhớ cache cục bộ khi sử dụng nút quay lại trong trình duyệt.Google Chrome không xác thực lại bằng etag trên/ra

Đây là một phần của phản ứng ban đầu:

HTTP/1.1 200 OK 
cache-control: private, must-revalidate 
etag: "c9239b5d4b98949f8469a05062e05bb999d7512e" 
Keep-Alive: timeout=5, max=100 
Connection: Keep-Alive 
Content-Type: text/html; charset=utf-8 

Nếu tôi làm mới trang tôi nhận được một "HTTP/1.1 304 Not Modified" phản ứng nhưng khi tôi sử dụng nút quay lại tôi nhận được câu trả lời sau đây:

Request URL:example.com 
Request Method:GET 
Status Code:200 OK (from cache) 

Phản hồi tôi đang tìm kiếm là 304 hoặc 200 OK, có thể đạt được điều này không?

Trả lời

13

Khi sử dụng các nút trở lại và về phía trước, chìa khóa Cache-Control chỉ để ngăn chặn trình duyệt trả về một bản sao cache của trang là no-store.

Không có gì khác sẽ hữu ích và không cần gì khác. Đầu đề Cache-Control của bạn có thể chỉ đơn giản là:

Cache-Control: no-store 

Có hai ngoại lệ cho điều này.

  1. Opera và Safari sẽ không xác thực lại cho dù bạn đặt tiêu đề nào (ít nhất là phiên bản tôi đã thử nghiệm). Nếu bạn mở trang trong tab mới, bản sao đó sẽ mới, nhưng tab gốc sẽ tiếp tục hiển thị phiên bản cũ khi điều hướng qua lại cho đến khi bạn làm mới hoặc nhập lại url.
  2. Firefox dường như có lỗi trong bộ nhớ đệm của trang đầu tiên được mở (tức là khi không có nút quay lại). Tất cả các phiên bản tiếp theo của trang sẽ làm mới khi bạn điều hướng qua lại, nhưng khi bạn sao lưu tất cả các cách đến trang trên cùng, nó có thể vẫn hiển thị bản sao cũ cũ của nó.

Cuối cùng, tôi nên lưu ý rằng việc sử dụng chỉ thị này không được khuyến khích nói chung vì nó rõ ràng có tác động đáng kể đến việc sử dụng băng thông. Trình duyệt thậm chí không thể tận dụng lợi thế của Etags để nhận được phản hồi 304 Not Modified, bởi vì nó sẽ không có bản sao được lưu trữ để sử dụng trong trường hợp một phản hồi 304 được nhận.

+1

Vì vậy, về cơ bản nếu bạn muốn nút quay lại/ra để làm việc bạn không thể tận dụng lợi thế của etags? – Dennis

+1

Có. Đó là những gì tôi đã tìm thấy trong tất cả các bài kiểm tra tôi đã làm. –

+0

http://madhatted.com/2013/6/16/you-do-not-understand-browser-history chứa một cuộc thảo luận thú vị về tình huống. – Gili

3

Chỉ thị "must-revalidate" chỉ áp dụng sau khi phản hồi là cũ (RFC2616, sec 14.9.4). Vì phản hồi không chứa tiêu đề "Hết hạn" cũng như chỉ thị "tối đa", trình duyệt có thể đã xử lý phản hồi khi vẫn còn mới và trả về bản sao được lưu trong bộ nhớ cache. Để ngăn chặn điều này, bạn nên bao gồm "max-age: 0" trong tiêu đề Cache-Control (và có thể là tiêu đề Expires chứa ngày tháng trong quá khứ), để phản hồi được lưu trữ trở nên cũ ngay lập tức. Ngoài ra, để ngăn chặn bộ nhớ đệm, hãy sử dụng chỉ thị "no-cache" thay vì "phải xác thực lại".

+1

Từ 13.2.4 của RFC2616: "Chỉ thị độ tuổi tối đa được ưu tiên hơn Hết hạn". Bạn không cần cả hai. Và trong mọi trường hợp, không có điều nào trong số này sẽ ngăn trình duyệt hiển thị bản sao cũ khi điều hướng bằng nút quay lại. –

+0

Tôi vừa xác nhận bình luận của James, giải pháp không hoạt động với nút quay lại. – Dennis

2

Chỉ thị bộ nhớ cache no-store có thể được sử dụng để hướng dẫn trình duyệt không ghi các trang vào bộ nhớ cache trên đĩa. Kết hợp với no-cache điều này sẽ đảm bảo tất cả các trình duyệt sẽ tìm nạp tài nguyên từ phía trên và không phải từ đĩa.

Cache-Control: private, no-cache, no-store

+0

Ngoại trừ tôi muốn trình duyệt xác thực lại thẻ khi điều hướng qua lại. – Dennis

+2

Điều đó sẽ vi phạm RFC2616 phần 13.13 (http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html) chỉ định trình duyệt KHÔNG nên xác thực lại: "Cơ chế lịch sử và bộ nhớ cache khác nhau. Trong các cơ chế lịch sử cụ thể NÊN KHÔNG thử để hiển thị một cái nhìn ngữ nghĩa minh bạch về trạng thái hiện tại của một tài nguyên. Thay vào đó, một cơ chế lịch sử có nghĩa là hiển thị chính xác những gì người dùng đã thấy tại thời điểm tài nguyên được lấy ra. " Các trình duyệt không xác thực lại hoặc tìm nạp các trang đã hết hạn được truy cập qua nút quay lại thực sự đang thực hiện điều RIGHT - nó không chỉ là những gì bạn muốn. – SpliFF

+1

Chỉ có 'no-store' hoạt động vì trình duyệt không có sự lựa chọn, nó không có bản sao cục bộ để hiển thị để nó có thể lấy nó ngược dòng. – SpliFF

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