Закінчується термін ETag vs Header


359

Я оглянувся, але не зміг зрозуміти, чи варто використовувати як ETag, так і Expires Header або те чи інше.

Що я намагаюся зробити, це переконатися, що мої флеш-файли (та інші зображення та те, що не оновлюються лише тоді, коли змінити ці файли).

Я не хочу робити нічого особливого, як, наприклад, змінити ім’я файлу або помістити якісь дивні символи на кінець URL-адреси, щоб воно не було кешоване.

Крім того, є щось, що мені потрібно робити програмно на своєму кінці в моїх скриптах PHP, щоб це підтримати чи це все Apache?


Відповіді:


677

Вони дещо відрізняються - ETag не має жодної інформації, яку клієнт може використати, щоб визначити, чи потрібно подавати запит на цей файл у майбутньому. Якщо ETag - це все, що він має, він завжди повинен буде зробити запит. Однак, коли сервер читає ETag з клієнтського запиту, сервер може визначити, чи надсилати файл (HTTP 200) або сказати клієнту просто використовувати їх локальну копію (HTTP 304). ETag - це лише контрольна сума для файлу, який семантично змінюється, коли зміст файлу змінюється.

Заголовок Expires використовується клієнтом (та проксі-серверами / кешами) для визначення, чи потрібно взагалі робити запит на сервер чи ні. Чим ближче ви до дати закінчення, тим більше шансів, що клієнт (або проксі) зробить HTTP-запит на цей файл із сервера.

Тому дійсно те, що ви хочете зробити, це використовувати заголовки BOTH - встановіть заголовок Expires на прийнятне значення, залежно від того, як часто змінюється вміст. Потім налаштуйте ETags для надсилання так, що коли клієнти DO надсилають запит на сервер, він може легше визначити, повертати файл чи ні.

Останнє зауваження про ETag - якщо ви використовуєте налаштування сервера з урівноваженим завантаженням на декількох машинах під керуванням Apache, ви, ймовірно, захочете вимкнути генерацію ETag. Це відбувається тому, що inode використовуються як частина алгоритму хешування ETag, який буде відрізнятися між серверами. Ви можете налаштувати Apache не використовувати inode як частину обчислення, але тоді ви хочете переконатися, що часові позначки на файлах точно однакові, щоб забезпечити генерування одного і того ж ETag для всіх серверів.


12
Ви також повинні перевірити, чи слід використовувати Cache-Control замість Expires. Я розумію, що кеш-контроль було введено після закінчення терміну дії та дає вам більше контролю. Дивіться stackoverflow.com/questions/5799906/…
Луїс Перес

6
Під час використання заголовка Expires - це корисна практика змінювати ім'я файлу кожного разу, коли ресурс змінюється, оскільки клієнт більше не запитуватиме файл, перш ніж він застарілий. Особливо, якщо ви використовуєте знаки далекого майбутнього як дати закінчення.
schnatterer

8
Скажемо, ми використаємо і те, і інше. Що відбувається, коли закінчився термін придатності, але файл не змінено (Етаг такий же)? Сервер поверне 304, а файл подаватиметься з кешу браузера. Моє запитання полягає в тому, чи буде відновлено час закінчення в цей момент?
користувач345602

2
Будьте уважні, встановивши ETAG і Expires в заголовку ненульового значення. Це може призвести до перегонів. Дивіться jakearchibald.com/2016/caching-best-practices
Вестон

2
Чи можна сказати серверам взагалі не використовувати inode чи часові позначки? Крім того, навіщо вони потрібні ETags, якщо вони використовуються лише для представлення вмісту?
Сеза

108

Заголовки Etag та Last-modified є валідаторами .

Вони допомагають браузеру та / або кешу (зворотному проксі) зрозуміти, чи змінився файл / сторінка, навіть якщо він зберігає те саме ім'я.

Термін дії та кеш-контроль дають оновити інформацію .

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

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


31

Expiresі Cache-Controlє "сильними заголовками кешування"

Last-Modifiedі ETagє "слабкими заголовками кешування"

Спочатку перевірте браузер, Expires/Cache-Controlщоб визначити, чи потрібно робити запит на сервер чи ні

Якщо потрібно зробити запит, він надішле Last-Modified/ETagHTTP-запит. Якщо Etagзначення документа збігається з цим, сервер надсилає код 304 замість 200, а не вміст. Браузер завантажить вміст із свого кешу.


1
чи знаходите ви якийсь документ, що підтримує кеширувальну поведінку "сильних і слабких"? Я не зміг його знайти, і мій веб-переглядач клієнта тепер надавав пріоритет останнім зміненим термінам дійсно, тому я не розумію, чому.
GMsoF

1
@GMsoF Ви можете поглянути на це: tools.ietf.org/html/rfc7232#section-2.1
Medeiros

Отже, якщо я хочу переконатися, що мої зміни негайно поширюються на клієнта, але все-таки виграють деякі кешування, я можу використовувати лише Last-Modified і ETag, правильно?
Себастьян Лорбер

Це найкоротша і все ж найясніша відповідь для мене! Дякую.
адерхокс

18

За замовчуванням Apache генерує Etag на основі номера inode файлу, дати останньої модифікації та розміру, який повинен бути ідеальним для виконання того, що ви хочете. Я думаю, що він також генерує за замовчуванням заголовок Last-Modified на основі часу останньої модифікації файлу на диску, що також прекрасно робити те, що ви хочете.

Ймовірно, ви також повинні мати Apache надсилати заголовок Expires на один рік у майбутньому (згідно з http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.21 ), щоб браузери знали вміст кешований. Погляньте на mod_expires, щоб налаштувати це.


Таким чином, ETag матиме останню змінену, і заголовок закінчується термін дії скаже, що я хочу, щоб він кешував його, і коли я завантажую і перезапилюю файл, він просто знову перетягнеться в кеш користувача, інакше буде створено 304, правильно?
GeoffreyF67

Етаг складним чином залежить від останньої модифікованої дати; але коли ви модифікуєте файл, позначка зміниться. Тоді відправлений браузером Etag (для його кешованої версії файлу) не відповідатиме Etag файлу на сервері, і Apache надішле файл, а не відповідь 304.
David Z

6
Чи не заголовок року, який закінчується, скаже клієнту навіть не перевірити нову версію протягом одного року?
Джон Бачір

@John: так, я думаю, я думав про статичний вміст, який ніколи не змінюється, коли я це писав.
David Z

2
@John Bachir: це повинно бути очікуваним способом поведінки, але браузер, здається, все одно потрапив на сервер, принаймні, щоб запитати про нову версію. Я відкрив ще одне питання з цього питання: stackoverflow.com/questions/10048740 / ...
Marco DeMaio

13

Ще одне резюме:

Вам потрібно використовувати і те, і інше. ETags - це інформація "серверної сторони". Термін дії - кешування «Сторона клієнта».

  • Використовуйте ETags, за винятком випадків, коли у вас є сервер збалансованого навантаження. Вони безпечні і дозволять клієнтам знати, що вони повинні отримувати нові версії файлів вашого сервера щоразу, коли ви щось змінюєте на своїй стороні.

  • Термін дії повинен використовуватися з обережністю, так як якщо ви встановите дату закінчення терміну придатності далеко в майбутньому, але хочете негайно змінити один з файлів (наприклад, JS-файл), деякі користувачі можуть не отримувати модифіковану версію довгий час!


2
У випадку виникнення цієї ситуації закінчується, вам потрібно перейменувати js та змінити його у свій HTML, і сподіваємось, що ви не встановили, що термін дії файлу HTML закінчується і 1 рік.
EralpB

1

Ще одне, що я хотів би зазначити, що деякі відповіді, можливо, були пропущені, - це недолік того, що ви маєте ETagsі Expires/Cache-controlв своїх заголовках.

Залежно від ваших потреб, це може просто додати зайві байти у ваші заголовки, що може збільшити пакети, що означає більше накладних витрат TCP. Знову ж таки, ви повинні побачити, чи потрібні накладні витрати з обома речами у своїх заголовках чи це просто додасть зайвої ваги вашим запитам, що знижує продуктивність.

Ви можете прочитати більше про це у цій чудовій публікації в блозі Кайла Сімпсона: http://calendar.perfplanet.com/2010/bloated-request-response-headers/


1

На мій погляд, із заголовком Expire, сервер може повідомити клієнту, коли мої дані будуть несвіжими, тоді як з Etag, сервер перевірятиме значення етапу для кожного запиту клієнта.


0

ETag використовується для визначення, чи повинен ресурс використовувати копію. і Закінчує заголовок, як Cache-Control, повідомляється клієнту, що перед тим, як кешувати десятиліття, клієнт повинен отримати локальний ресурс.

На сучасних сайтах часто пропонується файл з назвою хеш, як app.98a3cf23.js, так що це хороша практика використання заголовка Expires. Крім цього, це також знижує вартість мережі.

Сподіваюся, це допомагає;)

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