Как генерируются ответы «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
.
Я хочу использовать такой же алгоритм для определения изменений в моих данных.
источник
Ответы:
Когда браузер помещает что-то в свой кэш, он также сохраняет заголовок
Last-Modified
илиETag
с сервера.Затем браузер отправляет запрос с заголовком
If-Modified-Since
илиIf-None-Match
, сообщая серверу отправить 304, если контент все еще имеет эту дату или ETag.Серверу нужен какой-то способ вычисления даты с изменениями или ETag для каждой версии каждого ресурса; обычно это происходит из файловой системы или отдельного столбца базы данных.
источник
ETag
Это ключевое слово, проверенное с помощью заголовков,ETag
остается одинаковым в обоихResponse Headers
&Response Headers From Cache
, вы можете сказать алгоритм позадиETag
. Я обновил свой вопрос с указанием моих требований.ETag
это просто поле, в котором сервер может хранить уникальный идентификатор (обычно хеш, номер версии или векторные часы). Это не поможет вам вычислить этот идентификатор вообще; это зависит от вашего серверного кода.max-age
браузеру делать запрос , если у вас большой размер? (как это может заглушить в 304 и вообще не делать запрос) ... вы хотите это, например, с "отпечатками пальцев" активов (они хороши навсегда). Иначе какой смыслmax-age
...кэш магазина браузера с датой (Last-Modified) или идентификатором (ETag), когда вам нужно запросить URL-адрес еще раз, браузер отправляет запросное сообщение с заголовком:
сервер вернет значение 304, если оператор if равен False, и браузер будет использовать кэш.
источник