Как именно работает «304 Not Modified»?

175
  • Как генерируются ответы «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.

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

VenomVendor
источник
2
Да, я погуглил, как работает 304 не модифицированный , но ответа не получил.
VenomVendor
1
Вы должны быть немного более общими. google.com/search?q=http%20caching
SLaks

Ответы:

201

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

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

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

SLaks
источник
1
ETagЭто ключевое слово, проверенное с помощью заголовков, ETagостается одинаковым в обоих Response Headers& Response Headers From Cache, вы можете сказать алгоритм позади ETag. Я обновил свой вопрос с указанием моих требований.
VenomVendor
4
@VenomVendor: ETagэто просто поле, в котором сервер может хранить уникальный идентификатор (обычно хеш, номер версии или векторные часы). Это не поможет вам вычислить этот идентификатор вообще; это зависит от вашего серверного кода.
Слух
@SLaks: Что произойдет, если на странице есть вызов db ... Существует вероятность того, что данные в базе данных изменились бы. В этом случае нет смысла проверять последний измененный вызов, Correct ?. . Как это условие рассматривается?
user1050619
3
@ user1050619: Ваш сервер должен убедиться в точности ETag. Если вы показываете данные из БД, вы должны включить это.
SLaks
Единственное, что до сих пор неясно - нужно ли max-ageбраузеру делать запрос , если у вас большой размер? (как это может заглушить в 304 и вообще не делать запрос) ... вы хотите это, например, с "отпечатками пальцев" активов (они хороши навсегда). Иначе какой смысл max-age...
Энди Хейден,
19

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

If-Modified-Since: позволяет вернуть 304 Not Modified, если дата последнего изменения не изменилась.

ETag: ETag - это непрозрачный идентификатор, назначаемый веб-сервером определенной версии ресурса, найденной по URL-адресу. Если представление ресурса по этому URL-адресу когда-либо изменяется, назначается новый и другой ETag.

If-None-Match: позволяет возвращать 304 Not Modified, если ETag не изменяется.

кэш магазина браузера с датой (Last-Modified) или идентификатором (ETag), когда вам нужно запросить URL-адрес еще раз, браузер отправляет запросное сообщение с заголовком:

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

сервер вернет значение 304, если оператор if равен False, и браузер будет использовать кэш.

宏杰 李
источник