Яка функція заголовка HTTP “Vary: Accept”?


93

Я використовую PHP для створення динамічних веб-сторінок. Як зазначено в наступному посібнику (див. Посилання нижче), тип MIME для XHTML-документів повинен бути "application / xhtml + xml", коли $ _SERVER ['HTTP_ACCEPT'] це дозволяє. Оскільки ви можете обслуговувати одну сторінку з двома різними MIME ("application / xhtml + xml" та "text / html"), вам слід встановити для заголовка HTTP "Vary" значення "Accept". Це допоможе кешу на проксі.

Посилання: http://keystonewebsites.com/articles/mime_type.php

Тепер я не впевнений у значенні: header ('Vary: Accept'); Я не дуже впевнений у тому, що саме зробить "Vary: Accept" ...

Єдине пояснення, яке я знайшов:

Після заголовка Content-Type надсилається заголовок Vary, щоб (якщо я це правильно розумію) повідомляти проміжні кеші, такі як проксі-сервери, що тип вмісту документа змінюється залежно від можливостей клієнта, який вимагає документ. http://www.456bereastreet.com/archive/200408/content_negotiation/

Будь-хто може дати мені "справжнє" пояснення цього заголовка ( з таким значенням ). Думаю, я розумію такі речі, як: Vary: Accept-Encoding, де кеш-пам’ять на проксі може базуватися на кодуванні сторінки, що обслуговується, але я не розумію: Vary: Accept


1
Чесно кажучи - не турбуйся. Залишаючи осторонь недоліки реалізації на цьому веб-сайті, єдиний раз, коли ви збираєтеся отримати переваги від обслуговування з вмістом XML-типу, це коли ви робите те, що неможливо зробити в text / html - і якщо все, що ви робите виключає Doctype та xmlns, тоді ви не збираєтеся робити ці речі. Дотримуйтесь тексту / html. Щодо цього, ви могли б також дотримуватися HTML 4.01.
Квентін

Так, я це розумію, і думаю, що подібні проблеми виникають занадто часто у веб-розробці. Дякуємо "повинен" у специфікаціях / RFC!
AlexV

2
Ймовірно, вам слід прочитати це: blogs.msdn.com/ieinternals/archive/2009/06/17/… перед тим, як розглянути можливість використання VARY.
EricLaw

1
Це відео має гарне пояснення щодо Vary:заголовка.
Каннан Мохан

Відповіді:


94
  • cache-controlТема є основним механізмом для сервера HTTP , щоб сказати кешуючий проксі - сервера «свіжість» у відповідь. (тобто, як / якщо довго зберігати відповідь у кеші)

  • У деяких ситуаціях cache-controlдиректив недостатньо. Дискусія робочої групи HTTP архівується тут, описуючи сторінку, яка змінюється лише залежно від мови. Це не правильний варіант використання заголовка варіації, але контекст цінний для нашого обговорення. (Хоча я вважаю, що заголовок Vary у такому випадку вирішить проблему, існує кращий спосіб.) З цієї сторінки:

Vary суворо для тих випадків, коли проксі-сервіс безглуздо або надмірно ускладнює реплікацію того, що робив би сервер.

Надуманий приклад:

Ваш HTTP-сервер має велику цільову сторінку. У вас є дві трохи різні сторінки з однаковою URL-адресою, залежно від того, чи користувач був там раніше. Ви розрізняєте запити та "кількість відвідувань" користувача на основі файлів cookie. Але - оскільки цільова сторінка вашого сервера настільки велика, ви хочете, щоб посередники-проксі, якщо це можливо, кешували відповідь.

Заголовків URL, Last-Modified та Cache-Control недостатньо, щоб дати це розуміння проксі-серверу кешування, але якщо ви додасте Vary: Cookie, механізм кешування додасть заголовок Cookie до своїх рішень щодо кешування.

Нарешті, для невеликого трафіку, динамічних веб-сайтів - я завжди знаходив просте Cache-Control: no-cache, no-storeі Pragma: no-cacheдостатнє.

Редагувати - щоб точніше відповісти на ваше запитання: заголовок запиту HTTP "Прийняти" визначає типи вмісту, які клієнт може обробити. Якщо у вас є дві копії одного вмісту за однією URL-адресою, які відрізняються лише типом вмісту, тоді використання Vary: Acceptможе бути доречним.

Оновлення 11 вересня 12:

Я включаю пару посилань, які з’явились у коментарях, оскільки цей коментар був спочатку опублікований. Вони обидва чудові ресурси для реальних прикладів (і проблем) із Vary: Accept; Якщо ви читаєте цю відповідь, вам також потрібно прочитати ці посилання.

Перший із видатних EricLaw про поведінку Internet Explorer із заголовком Vary та деякі проблеми, які він створює для розробників: Vary Header запобігає кешуванню в IE . Коротше кажучи, IE (до IE9) не кешує будь-який вміст, який використовує заголовок Vary, оскільки кеш запиту не включає заголовки HTTP-запиту. EricLaw (Ерік Лоуренс у реальному світі) - менеджер програм у команді IE.

Другий - від Ерана Медана, і це поточне обговорення несподіваної поведінки, пов’язаної з Vary в Chrome: резервне копіювання неправильно обробляє заголовок Vary . Це пов’язано з поведінкою IE, за винятком того, що розробники Chrome застосували інший підхід - хоча, схоже, це не був навмисний вибір.


3
Остерігайтеся цього разом із кнопкою "Назад" у веб-переглядачі Chrome, у цій помилці є якась полум’яна війна (яка зараз чомусь не виправлена) code.google.com/p/chromium/issues/detail?id=94369
Еран Медан

6
@EranMedan З тих пір помилку Chrome виправлено.

59

Vary: Acceptпросто говорить, що відповідь була сформована на основі Acceptзаголовка у запиті. Запит з іншим Acceptзаголовком може отримати іншу відповідь.

(Ви можете бачити, що зв’язаний PHP-код виглядає $HTTP_ACCEPT. Це значення Acceptзаголовка запиту.)

Для HTTP-кеш-пам’яті це означає, що відповідь повинна бути кешована з особливою обережністю. Це буде дійсним збігом для подальших запитів із точно таким же Acceptзаголовком .

Тепер це має значення лише в тому випадку, якщо сторінку можна кешувати в першу чергу. За замовчуванням сторінки PHP не є. Сторінка PHP може позначити вихідні дані як кешовані, надіславши певні заголовки ( Expiresнаприклад). Але чи потрібно і як це робити - це вже інше питання.


це "може отримати" чи це "повинно отримати"?
Pacerier

6
@Pacerier "може отримати" є правильним. Vary: Acceptне означає, що кожне окреме можливе Acceptзначення заголовка видає різну та унікальну відповідь. Це означає лише, що інший Acceptзаголовок може спричинити іншу відповідь.
Джейсон Орендорф,


2

Насправді найближчим часом з’являється значна кількість нових функцій (і вже в Chrome), які роблять Varyзаголовок надзвичайно корисним. Наприклад, розглянемо підказку клієнту . Наприклад, під час підключення до зображень, підказка клієнта дозволяє серверу оптимізувати такі ресурси, як зображення, залежно від:

  • Ширина зображення
  • Ширина області огляду
  • Тип кодування, що підтримується браузером (думаю WebP)
  • Downlink (по суті, швидкість мережі)

Отже, сервер, який підтримує ці функції, встановить Varyзаголовок, щоб це вказати.

Chrome рекламує підтримку WebP, встановлюючи "image / webp" як частину Varyзаголовка для кожного запиту. Отже, сервер може переписати зображення як WebP, якщо браузер його підтримує, тому проксі потрібно буде перевірити заголовок, щоб не кешувати зображення WebP, а потім подати його браузеру, який не підтримує WebP. Очевидно, що якщо ваш сервер цього не робить, це не має значення. Отож, оскільки відповідь сервера змінюється на Acceptзаголовок запиту, відповідь повинна містити це, щоб не плутати проксі:

Vary: Accept

Іншим прикладом може бути ширина зображення. У мобільному браузері Widthзаголовок може бути досить маленьким для адаптивного зображення, порівняно з тим, яким він буде, якщо його переглянути з браузера на робочому столі. Отже, у цьому випадку Widthдодавання до Varyзаголовка є важливим для проксі-сервера, щоб не кешувати невелику мобільну версію та не подавати її для браузерів на робочому столі, або навпаки. У цьому випадку заголовок може містити:

Vary: Accept, Width

Або в тому випадку, якщо сервер підтримував усі специфікації натяку клієнта, заголовок мав би щось на зразок:

Vary: Accept, DPR, Width, Save-Data, Downlink
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.