2010-09-23 36 views
7

Tôi muốn phản hồi HTTP hết hạn sau 24 giờ kể từ bây giờ (có nghĩa là trình duyệt sẽ không thực hiện bất kỳ yêu cầu nào cho URL đó cho đến ngày mai). Nhưng, nếu yêu cầu được phát hành lại vào ngày mai sau khi hết hạn, tôi muốn đảm bảo trình duyệt sẽ gửi đúng tiêu đề yêu cầu để máy chủ gửi 304 thay vì buộc khách hàng tải xuống lại toàn bộ nội dung phản hồi nếu nó có Không được thay đổi trên máy chủ. Và tôi muốn rằng 304 cũng hết hạn 24 giờ sau đó.các tiêu đề phản hồi HTTP chính xác gây ra 304 sau khi hết hạn nội dung

Trước tiên, sccenario này có thể không? Hay tôi phải chọn giữa bộ nhớ đệm kiểu hết hạn và bộ nhớ đệm kiểu 304, nhưng không phải là cả hai? Nếu có thể, các tiêu đề phản ứng phù hợp (cả phản ứng ban đầu lẫn các 304s tiếp theo) sẽ làm cho nó xảy ra như thế nào?

Nếu như thường xảy ra, câu trả lời khác nhau tùy theo loại/phiên bản trình duyệt, sau đó tiêu đề nào hoạt động cho trình duyệt nào-- và trình duyệt nào sẽ không thể làm những gì tôi muốn? Tôi chỉ quan tâm đến các trình duyệt phổ biến nhất hiện đang sử dụng (ví dụ: IE6 +, FF3 +, Chrome mới nhất, Safari mới nhất)?

Xin lỗi nếu câu trả lời này đã được hỏi trên SO-- Tôi đã tìm kiếm một lúc và trống.

CLARIFICATION: Tôi đang đặt cùng một bộ thử nghiệm tự động để xác minh, bất kể nền tảng máy chủ là ứng dụng web đang tạo đúng tiêu đề HTTP để tạo hành vi lưu vào bộ nhớ cache muốn tất cả các ứng dụng web của chúng tôi có. Vì vậy, tôi không quan tâm (ít nhất là bây giờ) trong cách cấu hình Apache/IIS/PHP/Rails/Django/JSP/ASP.NET/etc. để tạo tiêu đề phù hợp. Tôi chỉ đơn giản muốn biết, chỉ ở lớp HTTP, tiêu đề phù hợp là gì.

CẬP NHẬT: Tôi tìm thấy this SO question để trả lời một phần câu hỏi của tôi. Theo số RFC 2616 10.3.5, tôi nói rằng tôi nên bao gồm tiêu đề Expires: hoặc Cache-Control: max-age cho 304 được trả về bởi máy chủ. Đây chắc chắn là hành vi mong muốn. Tuy nhiên, câu hỏi đó không trả lời là liệu phương pháp tương thích RFC này có hoạt động trên các trình duyệt phổ biến hiện có hay không, đặc biệt là IE6/7/8 là thủ phạm tuân thủ tiêu chuẩn thông thường, nhưng cũng là IE9, FF4 +, mới nhất. Chrome và Safari mới nhất mà ứng dụng của chúng tôi cũng phải hỗ trợ. Nếu bất kỳ trình duyệt nào không hoạt động như các nhiệm vụ RFC, có cách nào tôi có thể sử dụng không?

+0

Không biết máy chủ web nào là realtes này và liệu nội dung được tạo bằng mã hay chỉ đơn giản là tệp tĩnh được máy chủ phân phối mà không thể trả lời được. – symcbean

+0

Trong trường hợp này, chúng hầu như chắc chắn sẽ là các yêu cầu động, nhưng câu hỏi của tôi là nền tảng máy chủ bất khả tri. Tôi chỉ đang tìm kiếm các tiêu đề phản hồi HTTP mong muốn để khiến khách hàng lưu vào bộ nhớ cache như tôi muốn. Tôi đã thêm một giải thích cho phần cuối của câu hỏi của tôi để xây dựng. –

Trả lời

5

Gửi tiêu đề ETAG để khách hàng có thể thực hiện yêu cầu HTTP có điều kiện để xác thực lại phản hồi sau khi thời hạn sử dụng đã hết hạn.

Gửi chỉ thị Cache-Control: max-age hoặc Expires để chỉ định thời điểm bạn muốn tài nguyên hết hạn.

Tránh sử dụng tiêu đề Vary hoặc bất kỳ chỉ thị nào cấm bộ nhớ đệm.

Các chỉ thị này sẽ hoạt động trong tất cả các trình duyệt phổ biến (IE6 +, Firefox, Chrome) ngoại trừ Safari trên Windows, một mình thiếu bộ nhớ cache HTTP liên tục hoạt động trên nhiều phiên.

http://blogs.msdn.com/b/ie/archive/2010/07/14/caching-improvements-in-internet-explorer-9.aspx giải thích điều gì xảy ra khi bạn không cung cấp tiêu đề bộ nhớ đệm phù hợp.

Trình kiểm tra phản hồi Bộ nhớ đệm của Fiddler sẽ giúp bạn hiểu cách một phản hồi đã cho sẽ được lưu vào bộ nhớ cache.

0

Tôi khuyên bạn nên sử dụng the ETag header.

+1

Chỉ một mình ETAG là không đủ, vì khách hàng sẽ vẫn thực hiện một yêu cầu HTTP mới mỗi lần để kiểm tra xem ETAG có còn hiệu lực hay không. Cần có ít nhất một tiêu đề bổ sung để kiểm soát hết hạn nội dung để ngăn chặn thực hiện bất kỳ yêu cầu nào trong 24 giờ trước khi kiểm tra lại cho một ETag mới. –

+0

Rất hữu ích, cảm ơn Justin! Vì vậy, tôi đoán bạn cần sử dụng tiêu đề 'Expires' cùng với' ETag', đúng không? –

+0

Tôi không chắc liệu Expires plus ETag sẽ thực hiện thủ thuật hay không (và ngay cả khi nó hoạt động trên nhiều trình duyệt?). –

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