Для двох наступних запитів, якому із наступних двох заголовків браузери надають більшої ваги, якщо один із них повинен змінитись: ETag чи Last-Modified?
Для двох наступних запитів, якому із наступних двох заголовків браузери надають більшої ваги, якщо один із них повинен змінитись: ETag чи Last-Modified?
Відповіді:
Згідно з RFC 2616, розділ 13.3.4, клієнт HTTP 1.1 ПОВИНЕН використовувати ETag у будь-яких умовних запитах кешу, і якщо присутні як ETag, так і Last Modified, він СЛІД використовувати обидва. Заголовок ETag вважається сильним валідатором (див. Розділ 13.3.3), якщо сервер явно не оголосив його слабким, тоді як Заголовок останньої модифікації вважається слабким, якщо між ним та заголовком Дати не існує щонайменше хвилинної різниці. Однак зверніть увагу, що Сервер також не повинен надсилати (але СЛІД, якщо це можливо).
Зверніть увагу, що Клієнт не перевіряє заголовки, чи не змінилися вони; він просто наосліп використовує їх у наступному умовному запиті; Сервер повинен вирішити, чи надсилати запитуваний вміст, чи відповідь 304 Not Modified. Якщо Сервер надсилає лише один, то Клієнт буде використовувати його поодинці (хоча для запиту Range корисні лише сильні валідатори). Звичайно, це також на розсуд проміжних кеш-пам’яті (якщо їм не було заблоковано кешування за допомогою директив кешування) та Серверу щодо того, як вони діятимуть на заголовки; RFC стверджує, що вони НЕ ПОВИННІ повертати 304 Not Modified, якщо валідатори несумісні, але оскільки значення заголовків генеруються сервером, він має досить велику свободу дій.
На практиці я помітив, що всі Chrome, FireFox та IE 7+ надсилають обидва заголовки, якщо такі є. Я також перевірив поведінку під час надсилання модифікованих заголовків, про що я вже підозрював з інформації в RFC. Четверо перевірених клієнтів надсилали умовні запити лише в тому випадку, якщо сторінки оновились або якщо сторінка вперше була запитана поточним процесом.
Хіба це не більше як вираз "АБО". У псевдокоді:
if ETagFromServer != ETagOnClient || LastModifiedFromServer != LastModifiedOnClient
GetFromServer
else
GetFromCache
=! є правильним оператором порівняння. Клієнт повинен зберігати буквальний рядок, отриманий від сервера, оскільки перетворення можуть створювати невеликі відмінності. Ви не можете припустити, що "новіше - краще".
Чому? Розглянемо випадок, коли оператор сервера повертає неправильну версію ресурсу. Скасована версія СТАРІША - але правильна.
Клієнт повинен використовувати версію, пропоновану на даний момент сервером; він може використовувати кешовану версію, лише якщо вона однакова. Таким чином, сервер повинен перевіряти рівність, а не "новішу".