2012-04-06 24 views
5

Tôi muốn trình duyệt luôn thêm (ngoại trừ lần đầu tiên) tiêu đề yêu cầu "If-Modified-Since" để tránh lưu lượng truy cập không cần thiết.Chrome không gửi "If-Modified-Since"

tiêu đề phản ứng là:

Accept-Ranges:bytes 
Cache-Control:max-age=0, must-revalidate 
Connection:Keep-Alive 
Content-Length:2683 
Content-Type:text/html; charset=UTF-8 
Date:Thu, 05 Apr 2012 13:06:19 GMT 
Keep-Alive:timeout=15, max=497 
Last-Modified:Thu, 05 Apr 2012 13:05:11 GMT 
Server:Apache/2.2.21 (Red Hat) 

FF 11 và IE 9 cả gửi "If-Modified-Since" và nhận được 304 phản ứng nhưng Chrome 18 không và nhận được 200.

Tại sao? Cách buộc Chrome gửi tiêu đề "Nếu được sửa đổi từ"? Tôi không biết liệu nó có quan trọng hay không nhưng tất cả các yêu cầu đều đi qua HTTPS.

+0

Vào cuối ngày, nó tùy thuộc vào trình duyệt, và bất kỳ lưu trữ trung gian, cho dù họ * sẽ * Nội dung thực sự nhớ cache (bạn có thể kiểm soát xem họ * nên *). Bạn sẽ không thể 100% ngăn tác nhân người dùng yêu cầu lại nội dung. –

+3

Tôi nhận thấy rằng Chrome không gửi tiêu đề If-Modified-Since trừ khi phản hồi là gzip'd. Tôi không chắc đó có phải là một mô hình thực sự hay chỉ là trải nghiệm của tôi khi cố xử lý việc cập nhật các tệp JS. – Ryan

+0

Bất kỳ lý do cụ thể nào để gửi Keep-Alive? –

Trả lời

20

Tôi đã theo đuổi vấn đề này một thời gian, tôi nghĩ rằng tôi muốn chia sẻ những gì tôi đã tìm thấy.

"Quy tắc thực sự khá đơn giản: bất kỳ lỗi nào với chứng chỉ có nghĩa là trang sẽ không được lưu vào bộ nhớ cache".

https://code.google.com/p/chromium/issues/detail?id=110649

Nếu bạn đang sử dụng một chứng chỉ tự ký, thậm chí nếu bạn nói với Chrome để thêm một ngoại lệ cho nó để tải trang, không có tài nguyên từ trang đó sẽ được lưu trữ, và yêu cầu tiếp theo sẽ không có tiêu đề If-Modified-Since.

+0

Whew, đã cứu tôi một loạt thời gian - cảm ơn! –

+0

Holy crap. Đã khiến tôi mãi mãi vấp phải điều này, nhưng đó chính xác là vấn đề tôi đang gặp phải. Cảm ơn một tấn! – Snekse

+0

Cảm ơn bạn @Teek. Bạn đã tiết kiệm thời gian của tôi và cứu tôi khỏi sự thất vọng: D –

4

tôi đã nhận thấy hầu hết các hành vi tương tự và những phát hiện của tôi là:

  • Đầu tiên của tất cả các chỉ số trạng thái 200 trong chrome không phải là toàn bộ sự thật, bạn cần phải nhìn vào "Kích thước nội dung" cột cũng. Nếu điều này nói "(từ bộ nhớ cache)", tài nguyên được lấy trực tiếp từ bộ nhớ cache mà không cần hỏi liệu nó đã được sửa đổi chưa.

  • Hành vi lưu vào bộ nhớ cache của tài nguyên thiếu bất kỳ dấu hiệu hết hạn hoặc độ tuổi tối đa nào có vẻ áp dụng khi yêu cầu các tệp tĩnh có tiêu đề được sửa đổi lần cuối. Tôi đã lưu ý rằng chrome (ver. 22):

    1. Yêu cầu tệp lần đầu tiên (rõ ràng vì nó không có trong bộ nhớ cache).
    2. Yêu cầu nếu nó được sửa đổi lần thứ hai (vì nó nằm trong bộ nhớ cache nhưng không có dấu hiệu của độ tươi).
    3. Sử dụng nó trực tiếp lần thứ ba và sau đó (ngay cả khi đó là phiên trình duyệt mới).
  • Tôi hơi bối rối bởi hành vi này nhưng nó là khá hợp lý, nếu nó là tĩnh, đã được sửa đổi một thời gian dài trước đây và không thay đổi kể từ lần cuối bạn có thể giả định rằng nó sẽ có giá trị trong một thời gian dài hơn (không biết làm thế nào họ tính toán nó mặc dù).

+0

Xin chào @Albert Bertilsson 1. yêu cầu tệp lần đầu tiên ** 2. ** 3. **, đây có phải là kết luận của bạn không?Tôi không nghĩ rằng nó đúng, chính sách mà bộ nhớ cache chrome được sử dụng nên được LM-Factor, không phải những gì bạn nói. Nếu bạn ref từ google doc chính thức, xin vui lòng qua liên kết, thx rất nhiều. – materliu

+0

Về điểm cuối cùng của bạn, trình duyệt sẽ biết liệu tệp có tĩnh không? –

3

Tôi vừa tìm thấy câu hỏi này và sau khi bối rối về hành vi của If_Modified_Since của Chrome, tôi đã tìm thấy câu trả lời.

Quyết định bộ nhớ cache của Chrome dựa trên tiêu đề Expires mà nó nhận được.Tiêu đề Expires có hai yêu cầu chính:

  1. phải được ở Greenwich Mean Time (GMT), và
  2. phải được định dạng theo RFC 1123 (mà về cơ bản là RFC 822 với bốn chữ số năm).

Cấu trúc của nó như sau:

Expires: Sat, 07 Sep 2013 05:21:03 GMT 

Ví dụ, trong PHP, sau kết quả đầu ra một tiêu đề được định dạng đúng.

$duration = time() + 3600 // Expires in one hour. 
header("Expires: " . gmdate("D, d M Y H:i:s", $duration) . " GMT"); 

("GMT" được nối vào chuỗi thay vì "e" múi giờ cờ bởi vì, khi được sử dụng với gmdate(), cờ sẽ ra "UTC", mà RFC 1123 coi không hợp lệ. Cũng lưu ý rằng PHP constantsDateTime::RFC1123DATE_RFC1123sẽ không cung cấp các định dạng thích hợp, kể từ khi họ ra sự khác biệt lấy múi giờ GMT trong giờ [tức là 02: 00]. chứ không phải là "GMT")

Xem W3C's date/time format specifications để biết thêm.

Tóm lại, Chrome sẽ chỉ nhận ra tiêu đề nếu nó tuân theo định dạng chính xác này. này, kết hợp với các tiêu đề Cache-Control ...

header("Cache-Control: private, must-revalidate, max-age=" . $duration); 

... cho phép tôi thực hiện kiểm soát bộ nhớ cache thích hợp. Sau khi Chrome nhận ra các tiêu đề đó, nó bắt đầu lưu vào bộ nhớ cache các trang tôi đã gửi (ngay cả với chuỗi truy vấn!) Và nó cũng bắt đầu gửi tiêu đề If_Modified_Since. Tôi đã so sánh nó với một ngày "được sửa đổi lần cuối" được lưu trữ, được gửi lại HTTP/1.1 304 Not Modified và mọi thứ hoạt động hoàn hảo.

Hy vọng điều này sẽ giúp bất kỳ ai khác tình cờ gặp gỡ!

2

tôi đã cùng một vấn đề, trong Chrome mọi yêu cầu luôn tình trạng mã 200, trong các trình duyệt khác 304.

Hóa ra tôi đã có vô hiệu hóa bộ nhớ cache (trong khi DevTools là mở) kiểm tra ở trên DevTools - Cài đặt - Trang chung .. :)

+0

chính xác những gì tôi đã phải đối mặt..thanks dude –

0
  1. Không tắt bộ nhớ cache trong Chrome Dev Tools (trên tab "Mạng").
  2. Bộ nhớ cache-Kiểm soát phải là Cache-Control: public. Sử dụng true như tham số thứ hai để header PHP chức năng: header("Cache-Control: public", true);
Các vấn đề liên quan