Як точно працює «304 не змінено»?


174
  • Як формуються відповіді "304 не змінені"?

  • Як браузер визначає, чи відповідає відповідь на запит HTTP 304?

  • Це встановлюється браузером або надсилається з сервера?

  • Якщо сервер надсилається, як сервер знає дані, доступні в кеші, а також як він встановлює зображення 304?

Думаю, якщо він генерується браузером:

function is_modified()
{
    return get_data_from_cache() === get_data_from_url();
}

function get_data_from_cache()
{
    return some_hash_or_xxx_function(cache_data);
}

function get_data_from_url()
{
     return some_hash_or_xxx_function(new_data);
}

function some_hash_or_xxx_function(data)
{
     // Do something with the data.
     // What is that algorithm?
     return result;
}

console.log(is_modified());

Я покладаюся на стороннього постачальника API, щоб отримати дані, проаналізувати та передати їх до моєї бази даних. Дані можуть або не можуть змінюватися під час кожного запиту, але заголовок завжди надсилається 200. Я не хочу розбирати, перевіряти останній унікальний ідентифікатор у БД і так далі ... щоб визначити зміну даних, ні порівняти результат безпосередньо, а не я md5(), sha1()і crc32()хешировав результат і працює добре, але мені цікаво про алгоритм визначення 304.

Я хочу використовувати такий же алгоритм, щоб визначити зміну моїх даних.


2
Так, я поглянув на те, як 304 не модифіковані роботи , але не отримав жодної відповіді.
VenomVendor

1
Вам потрібно бути трохи більш загальним. google.com/search?q=http%20caching
SLaks

Відповіді:


200

Коли браузер поміщає щось у свій кеш, він також зберігає Last-ModifiedабоETag заголовок від сервера.

Потім браузер надсилає запит із If-Modified-SinceабоIf-None-Match заголовком , повідомляючи серверу надіслати номер 304, якщо вміст все ще має цю дату або ETag.

Сервер потребує певного способу обчислення модифікованої дати або ETag для кожної версії кожного ресурсу; зазвичай це відбувається з файлової системи або окремого стовпця бази даних.


1
ETagце ключове слово, позначене заголовками, ETagзалишається однаковим і в обох Response Headers& Response Headers From Cache, чи можете ви сказати алгоритм позаду ETag. Я оновив своє запитання, вказуючи свою вимогу.
VenomVendor

4
@VenomVendor: ETagце просто поле, де сервер може зберігати унікальний ідентифікатор (зазвичай номер хеша або версії або векторний годинник). Це зовсім не допоможе вам обчислити цей ідентифікатор; це залежить від вашого коду на сервері.
СЛАкс

@SLaks: Що станеться, якщо на сторінці є db-дзвінок ... Є ймовірність, що дані в db змінилися б. У цьому випадку не має сенсу перевіряти наявність останнього зміненого дзвінка, Правильно ?. .Як вивчається цей стан?
користувач1050619

3
@ user1050619: Ваш сервер повинен переконатися в точності ETag. Якщо ви показуєте дані з БД, вам потрібно це включити.
СЛАкс

Що ще незрозуміло - чи є у вас великий, max-ageчи потрібен браузер, щоб зробити запит? . Інакше в чому сенс max-age...
Енді Хейден

19

Остання зміна: остання змінена дата для запитуваного об'єкта

If-Modified-Since: Дозволяє повернути 304 Not Modified, якщо остання змінена дата не змінюється.

ETag: ETag - непрозорий ідентифікатор, призначений веб-сервером певній версії ресурсу, знайденому за URL-адресою. Якщо представлення ресурсів за цією URL-адресою коли-небудь змінюється, призначається новий і інший ETag.

If-None-Match: Дозволяє повернути 304 Not Modified, якщо ETag не змінився.

кеш-пам'ять браузера з датою (Last-Modified) або id (ETag), коли вам потрібно ще раз подати запит на URL-адресу, браузер надішле повідомлення про запит із заголовком:

введіть тут опис зображення

сервер поверне 304, коли оператор if не відповідає, а браузер буде використовувати кеш.

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