if-Modified-Since vs if-None-match


89

Яка може бути різниця між if-modified-since та if-none-match? У мене відчуття, що if-none-match використовується для файлів, тоді як if-modified-since використовується для сторінок?

Відповіді:


112

Щодо відмінностей між Last-Modified/If-Modified-Sinceта ETag/If-None-Match:

І те, і інше можна використовувати як взаємозамінні. Однак залежно від типу ресурсу та того, як він генерується на сервері, на той чи інший питання ("чи було це змінено з ...?" / "Чи все-таки це відповідає цьому ETag?") Може бути простіше відповісти .

Приклади:

  • Якщо ви обслуговуєте файли, використання файлів mtimeяк Last-Modifiedдати є найпростішим рішенням.
  • Якщо ви обслуговуєте динамічну веб-сторінку, побудовану на основі кількох запитів SQL, перевірка, чи не змінилися дані, повернені будь-яким із цих запитів, може бути недоцільною (якщо всі вони не мають якогось стовпця "останньої зміни"). У цьому випадку використовувати, наприклад, хеш md5 вмісту сторінки, оскільки це ETagбуде набагато простіше.
    OTOH, це означає, що вам все одно доведеться створити цілу сторінку на сервері, навіть для умовного GET. Визначення того, що саме має входити в ETag (первинні ключі, номери редакцій, ... тощо), може заощадити тут багато часу.

Детальніше про тему дивіться за цими посиланнями:


Я надіслав браузеру ETag, але він ніколи не запитує ту саму сторінку з If-None-Match. У чому може бути проблема?
Pacerier

2
@pacerier: Браузери не повинні використовувати Etag. Тож це може бути старий браузер і просто ігноруючи його. Інша можливість полягає в тому, що доступ до сутності здійснюється за допомогою параметрів url, які змінюються від виклику до виклику. Якщо ім'я сутності змінюється, etag не буде використовуватися для різних запитів.
Рафаель Баптіста

@RafaelBaptista Щоб детальніше розказати про свою другу половину коментаря, скажіть, у мене така ситуація: у мене є файловий сервер, і сервер підтримує встановлення версій за допомогою ETags, і з міркувань зворотної сумісності ми використовували, щоб клієнти використовували параметр запиту my_current_version = (версія ). Якщо я відправляю запит HTTP із різними значеннями для my_current_version, а також із ETags, то який критерій, як найкраща практика, буде пріоритетним при виборі, чи обслуговувати нову версію, чи відправляти назад 304? Дякую!
laughing_man

1
Як сервер використовує Etag, залежить від сервера. Можливо, ви можете налаштувати більшість файлових серверів на ігнорування параметрів за допомогою etag, якщо хочете, за допомогою правил перезапису. Ви менше контролюєте клієнта - браузер. Більшість не надсилатимуть заголовок етапу, який вони отримали для одного набору параметрів у запиті на інший. Клієнтський запит на зображення? V = 1 не надсилає той самий етап для зображення? V = 2. Якби я писав власні сервери, я б реалізував etag як хеш вмісту зображення. Будь-яку URL-адресу, яка запитує ресурс, і постачається з етапом, який відповідає хешу зображення, яке я б надіслав, повертаю 304.
Рафаель Баптіста,

22

If-Modified-Sinceпорівняно з Last-Modifiedтоді If-None-Matchяк порівняно з ETag. І те, Modified-Sinceі ETagінше можна використовувати для ідентифікації конкретного варіанту ресурсу.

Але порівняння If-Modified-Sinceз Last-Modifiedдає вам інформацію , чи знаходиться в кеші варіант старше або новіший , тоді як порівняння , If-None-Matchщоб ETagпросто дає інформацію про те , як є ідентичними чи ні. Крім того, більшість ETagгенераторів включають інформацію про специфічний для системи inode, тому переміщення файлу на інший диск також може змінити ETag.


Цікаво, але чому я б використовував "однакові" перевірки над "останньо зміненими" чеками? Які переваги? Якщо файл має служити, який із них є кращим варіантом?
Вежа

7
З комп’ютерами час неміцний. Високосні секунди, перемикання між переходом на перехід на світловий день та неточні годинники можуть призвести до того, що перевірка "останньої модифікації" поверне неправильний результат. Порівняння самого вмісту (або хешу вмісту MD5) дозволяє уникнути цих проблем.
devdanke

Незважаючи на те, що я повністю розумію @devdanke, я б сказав, що перевірка мітки часу набагато швидша, ніж перевірка md5sum. Мета цих заголовків - зробити це швидким, іноді переважно не передавати клієнту свіжу версію сутності, ніж завантажувати сервер введенням / виведенням. У будь-якому випадку, користувач завжди може натиснути ctrl + shift + R (або ctrl + F5 або що завгодно)
Grief

13

Значення часової позначки, яке використовується в Last-Modified / If-Modified-Since, має обмежену точність - одну секунду, і цього просто недостатньо для швидкого зміни вмісту, наприклад, наприклад, програми веб-чату, де в будь-яку секунду можна опублікувати більше одного повідомлення . ETag / If-None-Match може допомогти вирішити цю проблему.


9

Як зазначено в найкращих практиках Google:

Важливо вказати один із Expires або Cache-Control max-age та один з Last-Modified або ETag для всіх кешованих ресурсів. Зайвим є вказувати як Expires, так і Керування кешем: max-age, або вказувати Last-Modified та ETag.

https://developers.google.com/speed/docs/best-practices/caching


ця URL-адреса більше не має тексту, подібного до цього. Не згадується жодних обмежень щодо використання Last-Modifiedз ETag(або, з боку вживаного агента, If-Modified-Sinceз If-None-Match). Подібним чином специфікація W3 не обмежує вас. Там сказано не використовувати If-Modified-Sinceз If-Match, але я припускаю, що це тому, що набір документів, які мають оновлені дати, але такий самий вміст, як визначено ETag, повинен бути досить малим.
mpag


3

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

ETag на сьогоднішній день є найбільш гнучким. Клієнти, що відповідають вимогам, повинні надіслати ETag в умовному запиті, тоді як вони ПОВИННІ надіслати обидва, якщо такі є.


0

Заголовок If-Modified-Since використовується, щоб вказати час, коли браузер востаннє отримав запитуваний ресурс. Заголовок If-None-Match використовується для вказівки тегу сутності, який сервер видав із запитуваним ресурсом під час останнього отримання.

Описаними двома способами ці заголовки використовуються для підтримки кешування вмісту в браузері, і вони дозволяють серверу вказувати браузеру використовувати кешовану копію ресурсу, а не відповідати повним вмістом ресурсу, якщо це не обов `язково.

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