Hết hạn với ETag vs Header


359

Tôi đã nhìn xung quanh nhưng không thể biết liệu tôi nên sử dụng cả ETag Tiêu đề hết hạn hay cái này hay cái khác.

Những gì tôi đang cố gắng làm là đảm bảo rằng các tệp flash của tôi (và các hình ảnh khác và những gì không chỉ được cập nhật khi có thay đổi đối với các tệp đó.

Tôi không muốn làm bất cứ điều gì đặc biệt như thay đổi tên tệp hoặc đặt một số ký tự lạ vào cuối url để làm cho nó không bị lưu vào bộ nhớ cache.

Ngoài ra, có bất cứ điều gì tôi cần phải làm theo chương trình trong phần cuối các tập lệnh PHP của mình để hỗ trợ điều này hay tất cả là Apache?


Câu trả lời:


677

Chúng hơi khác nhau - ETag không có bất kỳ thông tin nào mà khách hàng có thể sử dụng để xác định xem có nên yêu cầu lại tệp đó trong tương lai hay không. Nếu ETag là tất cả những gì nó có, nó sẽ luôn phải đưa ra yêu cầu. Tuy nhiên, khi máy chủ đọc ETag từ yêu cầu máy khách, máy chủ có thể xác định xem có nên gửi tệp (HTTP 200) hay yêu cầu khách hàng chỉ sử dụng bản sao cục bộ của họ (HTTP 304). Một ETag về cơ bản chỉ là một tổng kiểm tra cho một tệp thay đổi về mặt ngữ nghĩa khi nội dung của tệp thay đổi.

Tiêu đề hết hạn được sử dụng bởi máy khách (và proxy / bộ nhớ cache) để xác định xem thậm chí có cần phải thực hiện một yêu cầu đến máy chủ hay không. Bạn càng đến gần ngày hết hạn, máy khách (hoặc proxy) càng có nhiều khả năng sẽ thực hiện yêu cầu HTTP cho tệp đó từ máy chủ.

Vì vậy, thực sự những gì bạn muốn làm là sử dụng các tiêu đề BÓNG - đặt tiêu đề Hết hạn thành giá trị hợp lý dựa trên tần suất thay đổi nội dung. Sau đó định cấu hình ETags được gửi để khi khách hàng gửi yêu cầu đến máy chủ, nó có thể dễ dàng xác định hơn có nên gửi lại tệp hay không.

Một lưu ý cuối cùng về ETag - nếu bạn đang sử dụng thiết lập máy chủ cân bằng tải với nhiều máy chạy Apache, có lẽ bạn sẽ muốn tắt thế hệ ETag. Điều này là do các nút được sử dụng như một phần của thuật toán băm ETag sẽ khác nhau giữa các máy chủ. Bạn có thể định cấu hình Apache để không sử dụng inodes như một phần của phép tính nhưng sau đó bạn muốn đảm bảo dấu thời gian trên các tệp giống hệt nhau, để đảm bảo cùng một ETag được tạo cho tất cả các máy chủ.


12
Bạn cũng nên kiểm tra xem bạn có nên sử dụng Cache-Control thay vì hết hạn hay không. Tôi hiểu rằng Cache-Control được giới thiệu sau khi hết hạn và cung cấp cho bạn nhiều quyền kiểm soát hơn. Xem stackoverflow.com/questions/5799906/ Mạnh
Luis Perez

6
Khi sử dụng tiêu đề Hết hạn, bạn nên thay đổi tên tệp bất cứ khi nào tài nguyên thay đổi, vì máy khách sẽ không yêu cầu lại tệp trước khi cũ. Đặc biệt nếu bạn đang sử dụng các giá trị tương lai xa như ngày hết hạn.
kẻ lừa đảo

8
Hãy nói rằng chúng tôi sẽ sử dụng cả hai. Điều gì xảy ra khi thời gian hết hạn đã hết, nhưng tệp không bị thay đổi (Etag giống nhau)? Máy chủ sẽ trả về 304 và tệp sẽ được phục vụ từ bộ đệm của trình duyệt. Câu hỏi của tôi là, sẽ được tái sinh thời gian hết hạn tại thời điểm này?
user345602 18/2/2015

2
Hãy cẩn thận đặt ETAG tiêu đề Hết hạn thành giá trị khác không. Điều này có thể dẫn đến điều kiện chủng tộc. Xem jakearchibald.com/2016/caching-best-practices
Weston

2
Có thể nói với các máy chủ không sử dụng inodes hoặc dấu thời gian không? Ngoài ra, tại sao chúng cần cho ETags, nếu nó chỉ được sử dụng để đại diện cho nội dung?
Cesar Castro

108

Etag và tiêu đề sửa đổi lần cuốitrình xác nhận .

Chúng giúp trình duyệt và / hoặc bộ đệm (proxy ngược) hiểu nếu một tệp / trang, đã thay đổi, ngay cả khi nó giữ nguyên tên đó.

Hết hạnKiểm soát bộ nhớ cache đang cung cấp thông tin làm mới .

Điều này có nghĩa là họ thông báo, trình duyệt và các proxy ở giữa, đến thời gian hoặc trong bao lâu, họ có thể giữ trang / tệp trong bộ nhớ cache của họ.

Vì vậy, câu hỏi thường là sử dụng một trình xác nhận hợp lệ nào, etag hoặc sửa đổi lần cuối và tiêu đề làm mới thông tin nào sẽ sử dụng, hết hạn hoặc kiểm soát bộ đệm.


31

ExpiresCache-Controllà "tiêu đề bộ nhớ đệm mạnh"

Last-ModifiedETaglà "tiêu đề bộ nhớ đệm yếu"

Trước tiên, trình duyệt kiểm tra Expires/Cache-Controlđể xác định xem có yêu cầu máy chủ hay không

Nếu phải thực hiện một yêu cầu, nó sẽ gửi Last-Modified/ETagyêu cầu HTTP. Nếu Etaggiá trị của tài liệu khớp với giá trị đó, máy chủ sẽ gửi mã 304 thay vì 200 và không có nội dung. Trình duyệt sẽ tải nội dung từ bộ đệm của nó.


1
Bạn có tìm thấy tài liệu nào hỗ trợ hành vi bộ nhớ đệm "mạnh và yếu" không? Tôi không thể tìm thấy một cái và trình duyệt máy khách của tôi hiện đang ưu tiên sửa đổi lần cuối khi hết hạn thực sự, điều mà tôi không hiểu tại sao.
GMsoF

1
@GMsoF Bạn có thể muốn xem cái này: tools.ietf.org/html/rfc7232#section-2.1
Medeiros

Vì vậy, nếu tôi muốn đảm bảo rằng các thay đổi của mình được truyền đến máy khách ngay lập tức, nhưng vẫn có lợi cho một số bộ đệm, tôi chỉ có thể sử dụng Last-Modified và ETag phải không?
Sebastien Lorber

Đây là câu trả lời ngắn gọn nhất và rõ ràng nhất đối với tôi! Cảm ơn.
aderchox

18

Theo mặc định, Apache sẽ tạo Etag dựa trên số inode của tệp, ngày được sửa đổi lần cuối và kích thước, sẽ hoàn toàn ổn để làm những gì bạn muốn. Tôi nghĩ rằng nó cũng sẽ tạo theo mặc định một tiêu đề Sửa đổi lần cuối dựa trên thời gian sửa đổi cuối cùng của tệp trên đĩa, điều này cũng hoàn toàn tốt để làm những gì bạn muốn.

Có lẽ bạn cũng nên yêu cầu Apache gửi một tiêu đề Hết hạn ngày một năm trong tương lai (theo http://www.w3.org/Prot Protocol / rfc2616 / rfc2616-sec14.html # sec14,21 ) để các trình duyệt biết nội dung là lưu trữ. Hãy xem mod_Exires để cấu hình nó.


Vì vậy, ETag sẽ có lần sửa đổi cuối cùng và tiêu đề hết hạn sẽ cho nó biết tôi muốn nó lưu vào bộ đệm và khi tôi tải lên và ghi đè lên tệp của mình, nó sẽ lại bị kéo xuống bộ đệm của người dùng nếu không 304 sẽ được tạo ra phải không?
GeoffreyF67

Etag phụ thuộc một cách phức tạp vào ngày sửa đổi cuối cùng; nhưng khi bạn sửa đổi tệp, Etag sẽ thay đổi. Sau đó, Etag được gửi bởi trình duyệt (đối với phiên bản tệp được lưu trong bộ nhớ cache của nó) sẽ không khớp với Etag của tệp trên máy chủ và Apache sẽ gửi tệp thay vì phản hồi 304.
David Z

6
Tiêu đề hết hạn một năm có nói với khách hàng rằng thậm chí không kiểm tra phiên bản mới trong một năm không?
John Bachir

@ John: yeah, tôi đoán tôi đã nghĩ về nội dung tĩnh không bao giờ thay đổi khi tôi viết nó.
David Z

2
@ John Bachir: shoudl be teh expecetd beahviour, nhưng trình duyệt dường như đánh vào máy chủ ít nhất là để yêu cầu phiên bản mới hơn. Tôi đã mở một câu hỏi khác về vấn đề này: stackoverflow.com/questions/10048740/
Kẻ

13

Một tóm tắt khác:

Bạn cần sử dụng cả hai. ETags là một thông tin "phía máy chủ". Hết hạn là bộ nhớ đệm "Phía máy khách".

  • Sử dụng ETags trừ khi bạn có máy chủ cân bằng tải. Chúng an toàn và sẽ cho khách hàng biết rằng họ sẽ nhận được các phiên bản mới của tệp máy chủ của bạn mỗi khi bạn thay đổi thứ gì đó về phía bạn.

  • Hết hạn sử dụng phải được sử dụng một cách thận trọng, vì nếu bạn đặt ngày hết hạn trong tương lai nhưng muốn thay đổi một trong các tệp ngay lập tức (ví dụ: tệp JS), một số người dùng có thể không nhận được phiên bản sửa đổi trong một thời gian dài!


2
Trong trường hợp hết hạn này, về cơ bản bạn cần đổi tên js của mình và thay đổi nó trong HTML của mình và hy vọng bạn cũng không đặt tệp HTML hết hạn 1 năm.
EralpB

1

Một điều nữa tôi muốn đề cập rằng một số câu trả lời có thể đã bỏ lỡ là nhược điểm của việc có cả hai ETagsExpires/Cache-controltrong các tiêu đề của bạn.

Tùy thuộc vào nhu cầu của bạn, nó có thể chỉ cần thêm các byte bổ sung trong các tiêu đề của bạn, điều này có thể làm tăng các gói có nghĩa là chi phí TCP nhiều hơn. Một lần nữa, bạn nên xem liệu chi phí có cả hai thứ trong tiêu đề của bạn là cần thiết hay nó sẽ chỉ tăng thêm trọng lượng trong các yêu cầu của bạn làm giảm hiệu suất.

Bạn có thể đọc thêm về nó trên bài đăng blog tuyệt vời này của Kyle Simpson: http://calWiki.perfplanet.com/2010/bloated-request-response-headers/


1

Theo quan điểm của tôi, với Expire Header, máy chủ có thể cho khách hàng biết khi nào dữ liệu của tôi sẽ cũ, trong khi với Etag, máy chủ sẽ kiểm tra giá trị etag cho từng yêu cầu của khách hàng.


0

ETag được sử dụng để xác định xem tài nguyên có nên sử dụng bản sao hay không. và Hết hạn Tiêu đề như Kiểm soát bộ đệm được thông báo cho khách hàng rằng trước hàng thập kỷ bộ đệm, khách hàng nên tìm nạp tài nguyên cục bộ.

Trong các trang web hiện đại, thường có một tệp có tên là băm, như app.98a3cf23.jsvậy, đó là một cách thực hành tốt để sử dụng Tiêu đề hết hạn. Bên cạnh đó, nó cũng giảm chi phí mạng.

Hy vọng nó giúp ;)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.