2010-10-14 33 views
18

Tôi có một trang có nhiều hình ảnh nhỏ (biểu tượng). Khi được sử dụng với chrome, mỗi lần trang được tải lại, chrome yêu cầu mỗi biểu tượng từ máy chủ có tiêu đề if-modified-since.Chrome - tại sao nó gửi yêu cầu nếu được sửa đổi?

Tất cả các biểu tượng được phân phát hết hạn và có độ tuổi tối đa. Firefox tải hình ảnh từ bộ nhớ cache của nó.

Tại sao Chrome làm điều đó và làm cách nào để ngăn chặn điều đó?

Cảm ơn

Trả lời

0

Điều đó nghe có vẻ như đang cố gắng tránh bộ nhớ cache đã lỗi thời bằng cách hỏi máy chủ xem hình ảnh đã thay đổi từ lần cuối cùng yêu cầu chúng chưa. Âm thanh như một điều tốt, không phải cái gì bạn muốn ngăn chặn.

4

Trình duyệt hiện đại trở nên phức tạp hơn và thông minh hơn với hành vi lưu vào bộ nhớ cache của chúng. Đọc qua http://blogs.msdn.com/b/ie/archive/2010/07/14/caching-improvements-in-internet-explorer-9.aspx để biết một số ví dụ và thông tin chi tiết hơn.

Như Florian nói, không chống lại nó :-)

+2

Vâng ... Tôi không vui mừng về việc nhận được nhiều yêu cầu không cần thiết đối với máy chủ của tôi và làm hỏng trải nghiệm người dùng cùng một lúc. Cảm ơn bạn đã đọc thú vị. – user473428

9

Một thử nghiệm nhanh với thanh tra của Chrome hiển thị rằng điều này chỉ xảy ra khi trang web được nạp lại, không phải khi nó được nạp bình thường. Chrome chỉ đang cố gắng làm mới bộ nhớ cache của nó. Hãy suy nghĩ về điều này - nếu bạn đặt ExpiresMax-Age thành nhiều thập kỷ, bạn có yêu cầu trình duyệt lưu trữ tài nguyên đó và không bao giờ kiểm tra xem nó có được cập nhật không? Đó là bộ nhớ đệm tài nguyên khi có thể, nhưng khi trang cần được làm mới, nó muốn đảm bảo rằng toàn bộ trang được làm mới. Các trình duyệt khác chắc chắn cũng làm như vậy (mặc dù một số trình duyệt có tùy chọn số giờ chờ trước khi làm mới).

Nhờ trình duyệt và máy chủ hiện đại, làm mới một số lượng lớn các biểu tượng sẽ không chậm như bạn nghĩ - yêu cầu được pipelined để loại bỏ nhiều sự chậm trễ chuyến đi và toàn bộ mục đích của tiêu đề If-Modified-Since là cho phép máy chủ để so sánh dấu thời gian và trả lại mã trạng thái "Không được sửa đổi". Điều này sẽ xảy ra cho mọi tài nguyên mà trang cần, nhưng trình duyệt sẽ có thể thực hiện tất cả các yêu cầu cùng một lúc và xác minh rằng không có yêu cầu nào trong số đó đã thay đổi.

Điều đó nói rằng, có một vài điều bạn có thể làm để làm cho điều này dễ dàng hơn:

  1. Trong thanh tra của Chrome, sử dụng tab nguồn lực để xem cách họ đang được nạp. Nếu không có tiêu đề yêu cầu, tài nguyên được tải trực tiếp từ bộ nhớ cache. Nếu bạn thấy 304 Not Modified, tài nguyên đã được làm mới nhưng không cần tải xuống lại. Nếu bạn thấy 200 OK, nó đã được tải xuống một lần nữa.

  2. Trong thanh tra của Chrome, sử dụng tab kiểm tra để xem suy nghĩ của nó về khả năng lưu trữ của tài nguyên của bạn, chỉ trong trường hợp một số tiêu đề bộ nhớ cache không tối ưu.

  3. Tất cả các yêu cầu If-Modified-Since và 304 phản hồi này có thể tăng lên, mặc dù chúng chỉ bao gồm tiêu đề. Kết hợp hình ảnh của bạn thành các sprites để giảm số lượng yêu cầu.

+0

Tôi thực sự bối rối về tất cả điều này. Chắc chắn, làm mới nên kiểm tra nội dung mới, âm thanh đúng. Nhưng chrome cũng gửi các yêu cầu đó cho tải trang bình thường. Để làm cho mọi việc trở nên khó hiểu hơn, có vẻ như hành vi hiện đã đột ngột thay đổi và hình ảnh được tải xuống từ bộ nhớ cache mà không có bất kỳ yêu cầu nào được sửa đổi. Tôi đã không thay đổi bất cứ điều gì o_O Tôi ghét nó khi các hệ thống không xác định như thế này. – user473428

+0

@user Theo như tôi có thể nói, đó là hành vi đúng. Liên kết của Andy về IE vẽ một bức tranh tương tự - giả sử đúng tiêu đề bộ nhớ cache, lần đầu tiên trong phiên, tài nguyên luôn được kiểm tra để cập nhật và sau đó luôn được lưu vào bộ nhớ cache cho đến khi tải lại được yêu cầu. Nó không phải là rất đơn giản, tôi biết, và có lẽ điều tốt nhất tôi có thể nói là những người viết trình duyệt, proxy và máy chủ đã đầu tư nhiều giờ vào việc này hơn bạn hoặc tôi. Tôi tin tưởng sự phán xét của họ. –

0

Giả sử bạn đang chạy Apache, bạn có thể cố gắng thiết lập rõ ràng thời gian lưu trong bộ nhớ cache cho một số loại tệp nhất định và/hoặc vị trí trong hệ thống tệp.

<FilesMatch ".(jpg|jpeg|png|gif)$">
Header set Cache-Control "max-age=604800, public" # 7 days
</FilesMatch>

hoặc một cái gì đó giống như

ExpiresByType image/jpeg "access plus 7 days"
ExpiresByType image/gif "access plus 7 days"
ExpiresByType image/png "access plus 7 days"

Thông thường, tôi sẽ loại nhóm các tập tin bằng cách sử dụng trong một thư mục duy nhất và thiết lập kiếp sống phù hợp.

Trình duyệt không nên yêu cầu tệp cho đến khi độ tuổi này đã hết hạn, nhưng không phải lúc nào cũng tôn trọng nó. Bạn có thể muốn/cần phải futz với tiêu đề Last-Modified và ETag. Có rất nhiều thông tin tốt trên web về điều này.

+0

Nhận xét "# 7 ngày" trên dòng Tiêu đề khiến Apache không tải. Rõ ràng nó không thích bình luận ở cuối dòng. –

12

Google Chrome sẽ bỏ qua tiêu đề Expires nếu đó không phải là ngày hợp lệ của RFC. Ví dụ, nó luôn đòi hỏi ngày được chỉ định là hai chữ số. Ngày 1 tháng 5 sẽ được đặt là "01 tháng 5" (không phải "ngày 1 tháng 5") và cứ tiếp tục như vậy. Firefox chấp nhận chúng, điều này đánh lừa người dùng rằng vấn đề là ở trình duyệt (trường hợp này, Chrome) và không phải là các giá trị tiêu đề. Vì vậy, nếu bạn đang đặt ngày hết hạn theo cách thủ công (không sử dụng mod_expires hoặc điều gì đó tương tự để tính ngày thực tế), tôi khuyên bạn nên kiểm tra các tiêu đề tệp tĩnh của mình bằng cách sử dụng REDbot.

14

Bạn đã kiểm tra các tiêu đề yêu cầu chưa?

"‘ Bộ nhớ cache-kiểm soát ’luôn được đặt thành‘ max-age = 0 ′, bất kể bạn nhấn enter, f5 hoặc ctrl + f5. Ngoại trừ nếu bạn khởi động Chrome và nhập url và nhấn enter. ”

http://techblog.tilllate.com/2008/11/14/clientside-cache-control/

+1

Cảm ơn, điều này đã trả lời một câu hỏi mà tôi có. –

13

Với chrome nó quan trọng cho dù bạn đang làm mới một trang hoặc chỉ cần truy cập nó.

Khi bạn làm mới, chrome sẽ ping máy chủ cho từng tệp bất kể chúng có được lưu trong bộ nhớ cache hay không. Nếu tệp chưa được sửa đổi, bạn sẽ thấy phản hồi 304 Không được sửa đổi. Nếu tệp đã được sửa đổi, bạn sẽ thấy một phản hồi 200 OK thay thế.

Khi không làm mới, các file cache sẽ có một tình trạng 200 OK nhưng nếu bạn nhìn vào cột kích thước/nội dung của bảng điều khiển mạng bạn sẽ thấy (từ bộ nhớ cache).

+0

Điều này cũng áp dụng cho Firefox. Thử nó. –

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