Как работает "304 Not Modified"?

  • Как генерируется "304 Not Modified"?

  • Как браузер определяет, отвечает ли ответ на 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 data
  // what is that algorithm.?
      return result;
}

console.log(is_modified());

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

Я хочу использовать такой же алгоритм для определения изменения данных.

Ответ 1

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

Затем браузер отправляет запрос с заголовком If-Modified-Since или If-None-Match, указывая серверу на отправку 304, если контент по-прежнему имеет эту дату или ETag.

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

Ответ 2

Last-Modified: последняя измененная дата для запрошенного объекта

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 False, а браузер будет использовать кеш.