2016-10-21 17 views
6

Tôi đang sử dụng tiêu đề ETag để lưu vào bộ nhớ cache và trình duyệt gửi tiêu đề If-None-Match tương ứng. Ban đầu, tôi chỉ đơn giản so sánh các tiêu đề này và nó hoạt động.Các công dụng của If-None-Match với nhiều thực thể là gì?

Sau đó xảy ra với tôi rằng rfc2616 cho phép danh sách các thực thể, vì vậy tôi đã sửa nó. Câu hỏi là, nếu bản sửa lỗi được sử dụng ...

  • Trình duyệt có bao giờ đưa ra yêu cầu với tiêu đề If-None-Match chứa nhiều thực thể không?
  • Có thế giới thực nào khác sử dụng không?
+0

Bạn có thể tham khảo [RFC 7230] (https://tools.ietf.org/html/rfc7230) ff. 2616 đã lỗi thời khá lâu rồi. Tuy nhiên, vấn đề vẫn tồn tại. Tôi sẽ xem xét nó sau, nghe có vẻ thú vị :) – DaSourcerer

+0

Quyền của dơi: Có thể là các lược đồ phiên bản như các lược đồ được sử dụng bởi WebDAV cần cho điều này. – DaSourcerer

Trả lời

1

Có hai trường hợp sử dụng mà tôi có thể nghĩ đến: liên kết giữa thẻ trình duyệt proxy và thẻ proxy thực thể lưu trữ và triển khai bộ nhớ cache phía máy khách tùy chỉnh.

Mặc dù, tôi chưa bao giờ thấy trình duyệt phân phát yêu cầu với nhiều thẻ thực thể trong If-None-Match, có proxy lưu trong bộ nhớ cache có thể có phiên bản riêng của tài nguyên được yêu cầu. Chúng có thể thay thế giá trị của If-None-Match được gửi bởi trình duyệt với sự kết hợp của thẻ phiên bản tài nguyên và thẻ phiên bản tài nguyên proxy của trình duyệt trước khi gửi yêu cầu thêm đến máy chủ. Bằng cách này, nếu proxy có phiên bản mới của tài nguyên được yêu cầu, bạn có thể giảm tải máy chủ bằng cách phân phối phản hồi đầy đủ (với tải trọng cơ thể) từ proxy thay vì máy chủ. Trường hợp này được mô tả bởi RFC 7234 Hypertext Transfer Protocol (HTTP/1.1): Caching:

Khi một bộ nhớ cache quyết định hợp lệ lại phản ứng được lưu trữ riêng của mình cho một yêu cầu có chứa một danh sách If-None-Match của thực thể-thẻ, bộ nhớ cache THỂ kết hợp các danh sách nhận với danh sách các thẻ thực thể từ bộ phản hồi được lưu trữ (mới hoặc cũ) và gửi liên kết của hai danh sách dưới dạng giá trị trường tiêu đề If-None-Match thay thế trong yêu cầu chuyển tiếp .

Tôi không thể nói liệu sự hỗ trợ của phần đó của RFC 7234 có rộng không, nhưng chắc chắn có các proxy hỗ trợ nó. Kiểm tra dự án Node.js Caching Reverse HTTP Proxy của Colin Mollenhour.

Mặt khác, bạn có thể không muốn dựa vào trình duyệt để thực hiện yêu cầu có điều kiện. Bạn có thể đặt If-None-Match giá trị tiêu đề HTTP của chính mình bằng cách sử dụng XMLHttpRequest.setRequestHeader(). Điều này có thể hữu ích nếu bạn lưu trữ nhiều phiên bản của tài nguyên bằng cách sử dụng Web Storage API, Cache API hoặc cơ chế khác. Phản hồi của máy chủ phải chứa tiêu đề HTTP ETag với thẻ-entity. Thẻ thực thể này cho biết phiên bản của tài nguyên nào được xem là mới.

0

Tôi đã đọc rất nhiều về các cơ chế lưu trong bộ nhớ cache gần đây và thấy mình đang hỏi câu hỏi này rất giống nhau. Tôi chỉ có thể nghĩ đến trường hợp sử dụng (ngoài những trường hợp mà Leonid đề cập), nơi lưu trữ và gửi nhiều số ETags là hợp lý: khi một mã nguồn mở rollbacks.

Có thể là tình cờ, chẳng hạn như api phục vụ dữ liệu json và dữ liệu cơ bản được cập nhật thường xuyên theo cách được khôi phục về phiên bản trước.

Nhưng cũng có thể là theo thiết kế, trong đó đối tượng cấu hình lớn chỉ có một vài phiên bản khác nhau có thể, sẽ chuyển sang rất nhiều. (tần suất mà nó sẽ được thay đổi là quan trọng, nếu không bộ nhớ đệm sẽ không mang lại giá trị nhiều).Trong trường hợp này, cache sẽ rất vui khi có tất cả các phiên bản sẵn sàng luôn sẵn sàng để được phục vụ.

Tôi biết đó là một cảnh quay dài và tôi không thể nghĩ ra bất kỳ tình huống thực tế nào phù hợp với một trong những điều này. Bên cạnh đó, xác thực lại thu hút, truy cập bộ nhớ cache là cách để đi =)

Ngoài ra, bạn có thể muốn đọc this. Nó xuất hiện tất cả lưu trữ lưu trữ chỉ gửi cuối cùng ETag (đó là dễ hiểu vì lý do bộ nhớ rõ ràng).

Hy vọng điều này sẽ giúp

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