Chức năng của tiêu đề HTTP “Vary: Accept” là gì?


93

Tôi sử dụng PHP để tạo các trang Web động. Như đã nêu trong hướng dẫn sau (xem liên kết bên dưới), loại MIME của tài liệu XHTML phải là "application / xhtml + xml" khi $ _SERVER ['HTTP_ACCEPT'] cho phép. Vì bạn có thể phân phát cùng một trang với 2 MIME khác nhau ("application / xhtml + xml" và "text / html"), bạn nên đặt tiêu đề HTTP "Vary" thành "Chấp nhận". Điều này sẽ giúp bộ nhớ cache trên proxy.

Liên kết: http://keystonewebsites.com/articles/mime_type.php

Bây giờ tôi không chắc về hàm ý của: header ('Vary: Accept'); Tôi không thực sự chắc chắn về chính xác những gì 'Vary: Accept' sẽ làm ...

Lời giải thích duy nhất tôi tìm thấy là:

Sau tiêu đề Loại-Nội dung, tiêu đề Vary được gửi đến (nếu tôi hiểu chính xác) cho các bộ nhớ đệm trung gian, như máy chủ proxy, rằng loại nội dung của tài liệu khác nhau tùy thuộc vào khả năng của ứng dụng khách yêu cầu tài liệu. http://www.456bereastreet.com/archive/200408/content_negotiation/

Bất cứ ai cũng có thể cho tôi một lời giải thích "thực sự" về tiêu đề này ( với giá trị đó ). Tôi nghĩ rằng tôi hiểu những thứ như: Vary: Chấp nhận-Mã hóa trong đó bộ nhớ cache trên proxy có thể dựa trên mã hóa của trang được phân phối, nhưng tôi không hiểu: Vary: Chấp nhận


1
Nói thẳng ra - đừng bận tâm. Bỏ qua những sai sót trong việc triển khai trên trang web đó, lần duy nhất bạn sẽ nhận được lợi ích từ việc phân phát với kiểu nội dung XML là khi bạn làm những việc không thể thực hiện được trong văn bản / html - và nếu tất cả những gì bạn đang làm đang chuyển đổi Doctype và xmlns, thì bạn sẽ không làm những việc đó. Bám sát vào văn bản / html. Đối với vấn đề đó, bạn cũng có thể sử dụng HTML 4.01.
Quentin

Vâng, tôi hiểu điều này và tôi nghĩ rằng những "vấn đề" như thế này nảy sinh quá thường xuyên trong quá trình phát triển Web. Cảm ơn "nên" trong thông số kỹ thuật / RFC!
AlexV

2
Bạn có thể nên đọc phần này: blog.msdn.com/ieinternals/archive/2009/06/17/… trước khi cân nhắc sử dụng VARY.
EricLaw

1
Video này có một lời giải thích tốt về Vary:tiêu đề.
Kannan Mohan,

Câu trả lời:


94
  • Các cache-controltiêu đề là cơ chế chính cho một máy chủ HTTP để kể một bộ nhớ đệm proxy "tươi mát" của một phản ứng. (tức là, làm thế nào / nếu bao lâu để lưu phản hồi trong bộ nhớ cache)

  • Trong một số tình huống, cache-controlchỉ thị là không đủ. Một cuộc thảo luận từ nhóm làm việc HTTP được lưu trữ tại đây, mô tả một trang chỉ thay đổi theo ngôn ngữ. Đây không phải là trường hợp sử dụng chính xác cho tiêu đề khác nhau, nhưng ngữ cảnh rất có giá trị cho cuộc thảo luận của chúng ta. (Mặc dù tôi tin rằng tiêu đề Vary sẽ giải quyết được vấn đề trong trường hợp đó, nhưng có một Cách Tốt hơn.) Từ trang đó:

Vary chỉ dành cho những trường hợp vô vọng hoặc quá phức tạp để proxy có thể sao chép những gì máy chủ sẽ làm.

  • RFC2616 "Định nghĩa trường tiêu đề " mô tả việc sử dụng tiêu đề từ góc độ máy chủ, RFC2616 "Phản hồi thương lượng trong bộ nhớ đệm " từ góc độ proxy bộ nhớ đệm. Nó nhằm chỉ định một tập hợp các tiêu đề yêu cầu HTTP xác định tính duy nhất của một yêu cầu.

Một ví dụ tiếp theo:

Máy chủ HTTP của bạn có một trang đích lớn. Bạn có hai trang hơi khác nhau với cùng một URL, tùy thuộc vào việc người dùng đã ở đó trước đó hay chưa. Bạn phân biệt giữa các yêu cầu và "số lượt truy cập" của người dùng dựa trên Cookie. Nhưng - vì trang đích của máy chủ của bạn quá lớn, bạn muốn các proxy trung gian lưu vào bộ nhớ cache phản hồi nếu có thể.

Các tiêu đề URL, Last-Modified và Cache-Control không đủ để cung cấp thông tin chi tiết này cho proxy bộ nhớ đệm, nhưng nếu bạn thêm Vary: Cookie, công cụ bộ nhớ cache sẽ thêm tiêu đề Cookie vào các quyết định lưu vào bộ nhớ đệm của nó.

Cuối cùng, đối với lưu lượng truy cập nhỏ, các trang web động - tôi luôn thấy đơn giản Cache-Control: no-cache, no-storePragma: no-cacheđủ.

Chỉnh sửa - để trả lời chính xác hơn câu hỏi của bạn: tiêu đề yêu cầu HTTP 'Chấp nhận' xác định các Loại Nội dung mà khách hàng có thể xử lý. Nếu bạn có hai bản sao của cùng một nội dung tại cùng một URL, chỉ khác nhau về Loại Nội dung, thì việc sử dụng Vary: Acceptcó thể phù hợp.

Cập nhật 11 tháng 9 12:

Tôi bao gồm một số liên kết đã xuất hiện trong các bình luận kể từ khi bình luận này được đăng ban đầu. Cả hai đều là nguồn tài nguyên tuyệt vời cho các ví dụ (và các vấn đề) trong thế giới thực với Vary: Accept; Nếu bạn đang đọc câu trả lời này, bạn cũng cần đọc các liên kết đó.

Đầu tiên, từ EricLaw nổi bật, về hành vi của Internet Explorer với tiêu đề Vary và một số thách thức mà nó đặt ra cho các nhà phát triển: Tiêu đề Vary ngăn chặn bộ đệm trong IE . Tóm lại, IE (trước IE9) không lưu vào bộ đệm bất kỳ nội dung nào sử dụng tiêu đề Vary vì bộ đệm yêu cầu không bao gồm các tiêu đề Yêu cầu HTTP. EricLaw (Eric Lawrence trong thế giới thực) là Giám đốc chương trình của nhóm IE.

Thứ hai là từ Eran Medan và là một cuộc thảo luận đang diễn ra về hành vi không mong muốn liên quan đến Vary trong Chrome: Sao lưu không xử lý chính xác tiêu đề Vary . Nó liên quan đến hành vi của IE, ngoại trừ các nhà phát triển Chrome đã thực hiện một cách tiếp cận khác - mặc dù nó có vẻ không phải là một lựa chọn có chủ ý.


3
Hãy cẩn thận với điều này cùng với nút quay lại trình duyệt trong Chrome, có một cuộc chiến nảy lửa đối với lỗi này (hiện đã được sửa lỗi này vì một số lý do) code.google.com/p/chromium/issues/detail?id=94369
Eran Medan

6
@EranMedan Lỗi Chrome đã được sửa.

59

Vary: Acceptchỉ đơn giản nói rằng phản hồi được tạo dựa trên Accepttiêu đề trong yêu cầu. Một yêu cầu có Accepttiêu đề khác có thể nhận được phản hồi khác.

(Bạn có thể thấy rằng mã PHP được liên kết nhìn vào $HTTP_ACCEPT. Đó là giá trị của Accepttiêu đề yêu cầu.)

Đối với bộ đệm HTTP, điều này có nghĩa là phản hồi phải được lưu vào bộ nhớ đệm cẩn thận hơn. Nó sẽ chỉ là một đối sánh hợp lệ cho các yêu cầu sau này có cùng một Accepttiêu đề .

Bây giờ điều này chỉ quan trọng nếu trang có thể lưu vào bộ nhớ cache ngay từ đầu. Theo mặc định, các trang PHP không. Một trang PHP có thể đánh dấu đầu ra là có thể lưu vào bộ nhớ cache bằng cách gửi một số tiêu đề nhất định ( Expiresví dụ:). Nhưng liệu và làm thế nào để làm điều đó là một câu hỏi khác.


nó là "có thể nhận được" hay là "nên nhận được"?
Pacerier

6
@Pacerier "có thể nhận được" là chính xác. Vary: Acceptkhông có nghĩa là mọi Acceptgiá trị tiêu đề riêng biệt có thể tạo ra một phản hồi khác nhau và duy nhất. Nó chỉ có nghĩa là một Accepttiêu đề khác có thể tạo ra một phản hồi khác.
Jason Orendorff


2

Trên thực tế, có một số tính năng mới đáng kể sắp ra mắt (và đã có trong Chrome) khiến Varytiêu đề trở nên cực kỳ hữu ích. Ví dụ, hãy xem xét Gợi ý của Khách hàng . Ví dụ: khi được sử dụng cùng với hình ảnh, gợi ý ứng dụng khách cho phép máy chủ tối ưu hóa các tài nguyên như hình ảnh tùy thuộc vào:

  • Chiều rộng hình ảnh
  • Chiều rộng khung nhìn
  • Loại mã hóa được trình duyệt hỗ trợ (nghĩ đến WebP)
  • Đường xuống (về cơ bản là tốc độ mạng)

Vì vậy, một máy chủ hỗ trợ các tính năng đó sẽ đặt Varytiêu đề để chỉ ra điều đó.

Chrome quảng cáo hỗ trợ WebP bằng cách đặt "image / webp" như một phần của Varytiêu đề cho mỗi yêu cầu. Vì vậy, một máy chủ có thể viết lại một hình ảnh dưới dạng WebP nếu trình duyệt hỗ trợ nó, vì vậy proxy sẽ cần phải kiểm tra tiêu đề để không lưu vào bộ nhớ cache hình ảnh WebP và sau đó phân phối nó đến một trình duyệt không hỗ trợ WebP. Rõ ràng, nếu máy chủ của bạn không làm điều đó, nó sẽ không thành vấn đề. Vì vậy, vì phản hồi của máy chủ khác nhau trên Accepttiêu đề yêu cầu, nên phản hồi phải bao gồm điều đó để không gây nhầm lẫn với proxy:

Vary: Accept

Một ví dụ khác có thể là chiều rộng hình ảnh. Trên trình duyệt dành cho thiết bị di động, Widthtiêu đề có thể khá nhỏ đối với hình ảnh đáp ứng, so với tiêu đề sẽ như thế nào nếu được xem từ trình duyệt trên máy tính để bàn. Vì vậy, trong trường hợp đó, việc Widththêm vào Varytiêu đề là điều cần thiết để proxy không lưu phiên bản di động nhỏ vào bộ nhớ cache và phân phát nó cho các trình duyệt trên máy tính để bàn hoặc ngược lại. Trong trường hợp đó, tiêu đề có thể bao gồm:

Vary: Accept, Width

Hoặc trong trường hợp máy chủ hỗ trợ tất cả các thông số kỹ thuật gợi ý của máy khách, tiêu đề sẽ giống như sau:

Vary: Accept, DPR, Width, Save-Data, Downlink
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.