2009-02-18 33 views
13

Trong mô-đun mod_expires Apache, có Expires chỉ với hai giai đoạn cơ sở thời gian, truy cậpsửa đổi.cache Hết Hạn kiểm soát với cuối Modification

ExpiresByType text/html "access plus 30 days" 

dễ hiểu nghĩa là bộ nhớ cache sẽ yêu cầu nội dung mới sau 30 ngày.

Tuy nhiên,

ExpiresByType text/html "modification plus 2 hours" 

không có ý nghĩa trực quan.

Bộ nhớ cache của trình duyệt biết rằng tệp đã được sửa đổi như thế nào trừ khi nó đưa ra yêu cầu tới máy chủ? Và nếu nó đang thực hiện một cuộc gọi đến máy chủ, việc sử dụng bộ nhớ đệm chỉ thị này là gì? Dường như với tôi rằng tôi không hiểu một số phần quan trọng của bộ nhớ đệm. Vui lòng làm sáng tỏ cho tôi.

Trả lời

35

An Expires* chỉ thị có "sửa đổi" làm cơ sở của nó đề cập đến thời gian sửa đổi của tệp trên máy chủ. Vì vậy, nếu bạn đặt, nói "sửa đổi cộng với 2 giờ", bất kỳ trình duyệt nào yêu cầu nội dung trong vòng 2 giờ sau khi tệp được sửa đổi (trên máy chủ) sẽ lưu nội dung đó cho đến 2 giờ sau thời gian sửa đổi của tệp. Và trình duyệt biết khi nào thời gian đó là do máy chủ gửi tiêu đề Expires với thời gian hết hạn thích hợp.

Hãy để tôi giải thích với một ví dụ: nói cấu hình Apache của bạn bao gồm dòng

ExpiresDefault modification plus 2 hours 

và bạn có một tập tin index.html, mà chỉ áp dụng đối với ExpiresDefault, trên máy chủ. Giả sử bạn tải lên phiên bản index.html lúc 9:53 GMT, ghi đè index.html hiện có trước đó (nếu có). Vì vậy, bây giờ thời gian sửa đổi của index.html là 9:53 GMT. Nếu bạn đang chạy ls -l trên máy chủ (hoặc dir trên Windows), bạn sẽ thấy nó trong danh sách:

-rw-r--r-- 1 apache apache 4096 Feb 18 09:53 index.html 

Bây giờ, với mọi yêu cầu, Apache sẽ gửi Last-Modified tiêu đề với thời gian sửa đổi cuối cùng của tập tin. Vì bạn có chỉ thị ExpiresDefault, nó cũng sẽ gửi tiêu đề Expires với thời gian bằng với thời gian sửa đổi của tệp (9:53) cộng với hai giờ. Vì vậy, đây là một phần của những gì các trình duyệt thấy:

Last-Modified: Wed, 18 Feb 2009 09:53:00 GMT 
Expires: Wed, 18 Feb 2009 11:53:00 GMT 

Nếu thời gian mà trình duyệt làm cho yêu cầu này là trước 11:53 GMT, trình duyệt sẽ cache trang, bởi vì nó vẫn chưa hết hạn.Vì vậy, nếu người dùng lần đầu tiên truy cập trang lúc 11:00 GMT, và sau đó đi đến cùng một trang một lần nữa lúc 11:30 GMT, trình duyệt sẽ thấy rằng phiên bản được lưu trong bộ nhớ cache của nó vẫn hợp lệ và sẽ không (hoặc đúng hơn, được phép không) tạo một yêu cầu HTTP mới.

Nếu người dùng truy cập trang lần thứ ba lúc 12:00 GMT, trình duyệt sẽ thấy phiên bản được lưu trong bộ nhớ cache của nó hiện đã hết hạn (sau 11:53) để nó xác thực trang, gửi yêu cầu đến máy chủ với tiêu đề If-Modified-Since. Đáp 304 (không sửa đổi) phản ứng với không có cơ thể sẽ được trả lại kể từ ngày của trang đã không được thay đổi kể từ khi nó được phục vụ đầu tiên. Kể từ ngày hết hạn đã qua - trang là 'cũ' - một yêu cầu xác nhận sẽ được thực hiện mỗi lần tiếp theo trang được truy cập cho đến khi xác nhận không thành công.

Bây giờ, giả sử thay vào đó bạn đã tải lên phiên bản mới của trang tại 11:57. Trong trường hợp này, nỗ lực của trình duyệt để xác nhận phiên bản cũ của trang lúc 12:00 thất bại và nó nhận được trong phản ứng, cùng với các trang mới, hai tiêu đề mới:

Last-Modified: Wed, 18 Feb 2009 11:57:00 GMT 
Expires: Wed, 18 Feb 2009 13:57:00 GMT 

(Thời gian sửa đổi cuối cùng của tệp trở thành 11:57 khi tải lên phiên bản mới và Apache tính thời gian hết hạn là 11:57 + 2:00 = 13:57 GMT.)

Xác thực (sử dụng ngày gần đây hơn) sẽ không được bắt buộc cho đến 13:57.

(Lưu ý tất nhiên rằng nhiều thứ khác được gửi cùng với hai tiêu đề tôi liệt kê ở trên, tôi chỉ cắt ra tất cả các phần còn lại cho đơn giản)

+0

Xin chào David, điều này có ý nghĩa, tuy nhiên tôi vẫn không chắc chắn, tại sao và cách máy chủ biết gửi trình duyệt. Vì vậy, nếu tôi hiểu chính xác, lần tiếp theo trình duyệt yêu cầu tài nguyên, máy chủ sẽ gửi thông tin đến trình duyệt về trạng thái sửa đổi tệp - nhưng không phải là này có được –

+0

Tôi đã tìm ra điều này sẽ dễ nhất để giải thích bằng ví dụ Tôi đã chỉnh sửa một trong ... –

+0

cảm ơn tuyệt vời cho thời gian của bạn –

0

Sự hiểu biết của tôi là sửa đổi yêu cầu trình duyệt dựa trên thời gian bộ nhớ cache dựa trên giá trị của tiêu đề HTTP được điều chỉnh cuối cùng. Vì vậy, sửa đổi cộng với 2 giờ sẽ là thời gian Modificatied cuối cùng + 2 giờ.

3

Máy chủ gửi tiêu đề như: "Last-Modified: Wed, 18 Feb 2009 00:00:00 GMT". Bộ nhớ cache hoạt động dựa trên tiêu đề này hoặc thời gian truy cập.

Giả sử nội dung được dự kiến ​​sẽ được làm mới mỗi ngày, sau đó bạn muốn nó hết hạn "sửa đổi cộng với 24 giờ".

Nếu bạn không biết khi nào nội dung sẽ được làm mới, thì tốt hơn nên căn cứ vào thời gian truy cập.

+0

Xin chào Andrew, Cảm ơn câu trả lời của bạn. Khi nào và Tần suất máy chủ gửi tiêu đề Sửa đổi lần cuối? hoặc điều đó xảy ra trong phiên trình duyệt –

0

Trước hết, nhờ vào David Z cho giải thích chi tiết trên . Trong câu trả lời cho câu hỏi của bushman về lý do tại sao nó có ý nghĩa để gọi bộ nhớ đệm nếu máy chủ vẫn còn cần thiết để thực hiện một yêu cầu, câu trả lời là thời gian được lưu trong những gì được trả về bởi máy chủ. Nếu chỉ thị bộ nhớ cache chỉ ra rằng nội dung của tệp vẫn còn mới, thay vì trả lại nội dung, mã 304 được trả về với phần thân phản hồi trống. Đó là nơi mà thời gian được lưu.

Một lời giải thích tốt hơn tôi đã cho là ở đây, từ https://devcenter.heroku.com/articles/increasing-application-performance-with-http-cache-headers:

Mặc dù yêu cầu điều kiện làm gọi một cuộc gọi trên mạng, tài nguyên chưa sửa đổi dẫn đến một cơ thể phản hồi trống - tiết kiệm chi phí chuyển nhượng tài nguyên quay lại máy khách cuối. Dịch vụ phụ trợ cũng thường có thể nhanh chóng xác định ngày sửa đổi cuối cùng của tài nguyên mà không truy cập vào tài nguyên tự lưu thời gian xử lý không tầm thường.

Time-based

Một yêu cầu có điều kiện thời gian dựa trên đảm bảo rằng chỉ khi tài nguyên yêu cầu đã thay đổi kể từ bản sao của trình duyệt được lưu trữ các nội dung sẽ được chuyển giao. Nếu bản sao được lưu trong bộ nhớ cache được cập nhật nhất thì máy chủ trả về mã phản hồi 304.

Để bật yêu cầu có điều kiện, ứng dụng chỉ định thời gian sửa đổi lần cuối của tài nguyên qua tiêu đề phản hồi được sửa đổi lần cuối.

Cache-Control: public, max-age = 31.536.000 Last Modified: Mon, 03 tháng 1 2011 17:45:57 GMT

Lần sau trình duyệt yêu cầu tài nguyên này nó sẽ chỉ yêu cầu về nội dung của tài nguyên nếu họ không thay đổi kể từ ngày này bằng cách sử dụng If-Modified-Since tiêu đề

If-Modified-Since: Mon, 03 tháng 1 2011 17:45:57 GMT

Nếu tài nguyên hasn' t đã thay đổi kể từ Thứ Hai, ngày 03 tháng 1 năm 2011 17:45:57 GMT máy chủ sẽ quay trở lại với một thân trống với mã phản hồi 304.

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