Как именно работает 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 the data.
     // What is that algorithm?
     return result;
}

console.log(is_modified());

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

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


person VenomVendor    schedule 07.01.2014    source источник
comment
Да, я искал в Google как работает 304 неизмененный, но ответа не получил.   -  person VenomVendor    schedule 07.01.2014
comment
Вы должны быть немного более общими. https://www.google.com/search?q=http%20caching   -  person SLaks    schedule 07.01.2014


Ответы (2)


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

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

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

person SLaks    schedule 07.01.2014
comment
ETag - ключевое слово, проверяется заголовками. ETag остается одинаковым в Response Headers и Response Headers From Cache, вы можете сказать алгоритм, лежащий в основе ETag. Я обновил свой вопрос, указав свои требования. - person VenomVendor; 07.01.2014
comment
@VenomVendor: ETag - это просто поле, в котором сервер может хранить уникальный идентификатор (обычно хэш, номер версии или векторные часы). Это совершенно не поможет вам вычислить этот идентификатор; это зависит от вашего серверного кода. - person SLaks; 07.01.2014
comment
@SLaks: Что произойдет, если на странице есть вызов БД ... Есть вероятность, что данные в БД изменились .. В этом случае нет смысла проверять последний измененный вызов, Правильно ?. Каким образом рассматривается это состояние? - person user1050619; 06.05.2014
comment
@ user1050619: Ваш сервер должен убедиться, что ETag является точным. Если вы показываете данные из БД, вам нужно включить это. - person SLaks; 07.05.2014
comment
Одна вещь, которая до сих пор неясна, заключается в том, нужно ли браузеру делать запрос при большом max-age? (так как он может заглушить 304 и вообще не делать запрос) ... вы хотите, например, с активами с отпечатками пальцев (они хороши навсегда). Иначе в чем смысл _2 _... - person Andy Hayden; 06.04.2016
comment
Это неполный ответ. Иногда ответ не содержит ни Last-Modified, ни ETAG заголовков, но все же может ответить 304. - person Octopus; 13.04.2016
comment
@Octopus: ответ 304 не нуждается в этих заголовках, поскольку он уже кэширован. - person SLaks; 13.04.2016

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

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

person 宏杰李    schedule 06.03.2017