2010-06-09 12 views
11

Tôi có một trang tải rất nhiều hình ảnh, css và javascript. Tôi đã thêm một tiêu đề hết hạn trong tương lai xa và đặt Cache-Control thành công khai trên các phụ thuộc bên ngoài này để chúng được lưu trữ. Nhưng mỗi khi tôi làm một bài đăng/chuyển hướng/nhận chrome cố gắng để tải lại. Hành vi này rất giống với tải lại trang. Tôi đã thêm ETags và xử lý tiêu đề If-None-Match giúp một chút, nhưng nó vẫn tạo ra quá nhiều yêu cầu vô ích.Tải lại toàn bộ trang trên Đăng/Chuyển hướng/Bỏ qua kiểm soát bộ nhớ cache

Làm cách nào để yêu cầu chrome và safari lấy tệp từ bộ nhớ cache?

chrome NOK 
safari NOK 
firefox OK 
ie  OK 

Xem thêm Full page reload on Post/Redirect/Get ignoring cache control trên diễn đàn hỗ trợ của google.

Làm rõ:

Tôi không muốn trình duyệt để yêu cầu image1.png hai lần. Nó sẽ được lưu trữ.

200 GET page1.html 
200 GET image1.png (Cache-Control: public, Expires and ETag) 
302 POST action.asp (form submitted from page1.html, redirects) 
200 GET page2.html 
304 GET image1.png (If-None-Match) 

Ví dụ:

tôi đã tạo ra một ví dụ đơn giản để minh họa cho vấn đề.

http://crydust.be/lab/prg/

Headers:

Các tiêu đề tôi gửi với hình ảnh là:

HTTP/1.1 200 OK 
Date: Fri, 18 Jun 2010 11:30:22 GMT 
Server: Apache 
Cache-Control: public, max-age=86400 
Expires: Sat, 19 Jun 2010 11:30:24 GMT 
Etag: "123" 
Content-Length: 866 
Content-Type: image/png 

nào nên làm cho nó được lưu trữ trong 24 giờ. Không có Vary: * hoặc bất cứ điều gì như thế.

Cập nhật: Hành vi này hiện cũng có trong Safari Mobile trên iOS 4. Một hồi quy khủng khiếp trong tốc độ tải trang.

Cập nhật: Có một thông báo lỗi về vấn đề này trong lỗi webkit. Bug 38690 - Submitting a POST that leads to a server redirect causes all cached items to redownload

Cập nhật: Vấn đề vẫn tồn tại trên iOS 4.0.1

Cập nhật: Vấn đề vẫn tồn tại trên iOS 4,1

Cập nhật: Vấn đề vẫn tồn tại trên iOS 4.2

Cập nhật: Vấn đề vẫn tồn tại trên iOS 4.2.1 và trong Chrome từ phiên bản 6 đến 9.

Cập nhật: Có một báo cáo lỗi về vấn đề này trong dự án Chromium.(Bạn có thể sao nó thể hiện bạn quan tâm) Issue 68621: Post/Redirect/Get ignoring cache instructions

Cập nhật: Vấn đề vẫn tồn tại trên Chrome từ phiên bản 6 đến 10 Nó bây giờ là một lỗi 9 tháng tuổi.

Cập nhật: Sự cố được khắc phục từ 2011-03-21 19:33:07 PST. Điều này được phản ánh trong hành vi của chrome 12 (canary).

+0

Đây là vấn đề về webkit, chứ không phải vấn đề cụ thể với Chrome. –

+0

@Dan, tôi biết, nhưng tôi mong các chàng trai google sửa lỗi này trong một trong nhiều bản phát hành của họ. Có sẵn bản vá nhưng chưa có bản vá nào trong chrome. –

+0

Tôi nghĩ rằng các bản vá gây ra một hồi quy, đó là lý do tại sao nó không được chấp nhận? –

Trả lời

1

Khi bạn F5/làm mới trong Chrome, Safari hoặc IE8, tất cả các tài nguyên GET được yêu cầu lại, ngay cả khi chúng đã được lưu trong bộ nhớ cache.

Nếu bạn xem yêu cầu/phản hồi bằng công cụ dev hoặc Fiddler, bạn sẽ thấy máy chủ phản hồi trạng thái HTTP 304 và không có nội dung. Điều này cho trình duyệt biết rằng họ không cần phải tải xuống lại và họ có thể tiếp tục sử dụng bộ nhớ cache.

Trong các tệp tab Tài nguyên của công cụ tìm kiếm của Chrome được làm mới như vậy sẽ có thời gian chờ, nhưng thời gian tải xuống là 0ms.

Nếu bạn tải lại trang bằng cách thoát và quay lại, bạn sẽ thấy rằng các tệp được lưu trong bộ nhớ cache này không được truy xuất lại và máy chủ không được chọn.

Hành vi này của F5/làm mới cho tài nguyên tĩnh GET là chính xác - đó là FX và IE6 đang làm sai. Nó cũng giúp với lệnh CTRL + F5 gây nhầm lẫn mà hầu hết người dùng không biết.

Bạn không thể cache POST hoặc trang mà trả về một HTTP chuyển hướng tạm thời:

thay đổi POST dữ liệu và phải luôn luôn nhắc nhở trước khi được gửi một lần nữa, và kết quả của nó không bao giờ được lưu trữ.

Chuyển hướng được xử lý ở mức thấp trong nội dung HTTP - bên dưới bộ nhớ đệm. Thực sự nó nói với trình duyệt để có được tài nguyên từ một nơi khác và trong khi nó có thể cache rằng nó đã không được lưu trữ trong chuyển hướng và cần phải kiểm tra lại.

Bạn sẽ có thể cache chuyển hướng vĩnh viễn 301, nhưng chuyển hướng tạm thời 302 hoặc 303 không được lưu trong bộ nhớ cache according to the HTTP spec.

+1

Người dùng không nhấn F5. Trình duyệt hoạt động như thể F5 được nhấn sau một bài đăng/chuyển hướng/nhận. Tôi không muốn cache chuyển hướng, chỉ là các hình ảnh tĩnh. –

+0

@Kristof Neirynck - Ahh, vì vậy bài đăng trả về một chuyển hướng và trang ping tất cả nội dung tĩnh với 304, nhưng nếu bạn liên kết thẳng đến nó, bạn sẽ nhận được nội dung tĩnh cục bộ được lưu trong bộ nhớ cache? Điều đó có vẻ như một lỗi. Kiểm tra các tiêu đề phản hồi trên nội dung tĩnh - một số tiêu đề (chẳng hạn như Vary: *) gây ra sự cố với bộ nhớ đệm của ứng dụng khách trong một số trình duyệt. Bạn có thể tìm thấy một giải pháp ở đó. – Keith

0

F5 tải lại tất cả tài nguyên của trang trong một số trình duyệt, vì vậy, họ bỏ qua tiêu đề bộ nhớ cache và yêu cầu mọi tài nguyên một lần nữa.

Nếu bạn muốn "cache" các trang POST, bạn phải chuyển đổi các trang đó trong tài nguyên tĩnh, tức là tạo tệp .html từ tệp .php ví dụ và sau đó phân phát .html dưới dạng tài nguyên tĩnh.

này chỉ có hiệu lực nếu nội dung của trang này không thay đổi

+0

Tôi không đẩy F5. Tôi đang thực hiện chuyển hướng bài đăng. –

0

Việc sửa chữa: cache-control: no-store

(Bạn cũng có thể muốn sử dụng mã trạng thái 307 thay vì 302, mà sẽ duy trì phương pháp này.)

các giải pháp đã được tìm thấy, sau nhiều ngày của sự thất vọng trong một bình luận trên this open WebKit bug:

CachedRawResource bây giờ giữ chuỗi chuyển hướng, và có một số logic tầm thường để kiểm tra tính chính xác, nhưng nó không ở đâu gần hoàn thành (chỉ kiểm tra cacheControlContainsNoStore()).Và tất nhiên các loại tài nguyên khác không có gì cả.