Какие коды состояния HTTP можно кэшировать?

Как указано в заголовке, какие коды состояния HTTP можно кэшировать в браузере? Я быстро поискал и не нашел авторитетного ответа.

Первоначально я думал, что это могут быть только 200 нормальные ответы, но я не мог найти никаких доказательств, подтверждающих эту мысль.


person sethmlarson    schedule 08.09.2016    source источник
comment
Серверы часто используют заголовок ответа Cache-Control, чтобы явно указать, что ответ должен быть кэширован (или нет); RFC 7234, раздел 5.2 описывает этот заголовок, его значения и семантику.   -  person Castaglia    schedule 09.09.2016
comment
Постоянные перенаправления (301) определенно кэшируются.   -  person Salman A    schedule 09.09.2016


Ответы (2)


Короткий ответ

Согласно RFC 7231, текущему справочнику по содержанию и семантике протокола HTTP / 1.1, следующие коды состояния HTTP определены как кэшируемые, если иное не указано методом определение или явные элементы управления кешем:

Длинный ответ

В RFC 7231 говорится следующее относительно кодов состояния HTTP, которые по умолчанию кэшируются:

6.1. Обзор кодов статуса

[...] Ответы с кодами состояния, которые определены как кэшируемые по умолчанию (например, 200, 203, 204, 206, 300, 301, 404, 405, 410, 414 и 501 в этой спецификации) могут быть повторно использованы кеш с эвристическим истечением срока, если иное не указано в определении метода или явные элементы управления кешем; все остальные коды состояния по умолчанию не кэшируются. [...]

Как только коды состояния HTTP становятся расширяемыми, получатель должен отметить кеширование ответа с нераспознанным кодом состояния:

6. Коды статуса ответа

Элемент status-code - это трехзначный целочисленный код, дающий результат попытки понять и удовлетворить запрос.

Коды состояния HTTP являются расширяемыми. От клиентов HTTP не требуется понимать значение всех зарегистрированных кодов состояния, хотя такое понимание, очевидно, желательно. Однако клиент ДОЛЖЕН понимать класс любого кода состояния, обозначенного первой цифрой, и рассматривать нераспознанный код состояния как эквивалентный коду состояния x00 этого класса, за исключением того, что получатель НЕ ДОЛЖЕН кэшировать ответ с нераспознанный код состояния. [...]

Кеш также зависит от метода HTTP:

4.2.3. Кешируемые методы

Методы запроса могут быть определены как «кэшируемые», чтобы указать, что ответы на них могут быть сохранены для повторного использования в будущем. Как правило, безопасные методы, не зависящие от текущего или авторитетного ответа, определяются как кэшируемые; эта спецификация определяет GET, HEAD и POST как кэшируемые, хотя подавляющее большинство реализаций кеширования поддерживают только GET и HEAD.

Что касается метода POST, есть важная деталь:

4.3.3. POST

[...] Ответы на POST запросы кэшируются, только если они содержат явную информацию о свежести [...]

Дополнительные сведения см. В определении каждого метода.

Дополнительные ресурсы

person cassiomolin    schedule 09.09.2016

Согласно RFC7234 также разрешено кэшировать ответы, доставляющие код, отличный от 200 ( OK):

[...] Наиболее распространенная форма записи в кэш - это успешный результат запроса на извлечение: то есть ответ 200 (OK) на запрос GET, который содержит представление ресурса, идентифицированного целью запроса (раздел 4.3. 1 из [RFC7231]). Однако также возможно кэшировать постоянные перенаправления, отрицательные результаты (например, 404 (не найдено)), неполные результаты (например, 206 (частичное содержимое)) и ответы на методы, отличные от GET, если определение метода допускает такое кеширование и определяет что-то подходящее для использования в качестве ключа кеша.

Так что разработчик браузера решает, что он хочет кэшировать, а что нет.

person AndiH    schedule 08.09.2016
comment
Интересно, существует ли согласованный стандарт о том, какие коды состояния браузер должен или не должен кэшировать, а не все, можно кэшировать? - person sethmlarson; 08.09.2016
comment
Не то, что я знаю из. В конце концов, кеш - это дополнительная функция. Если вы посмотрите главу 3 RFC, вы увидите, что кешу вообще не нужно кэшировать какие-либо ответы: 3. Хранение ответов в кэше - кэш НЕ ДОЛЖЕН хранить ответ на любой запрос - person AndiH; 08.09.2016
comment
@twittfort Ваш предыдущий комментарий не точен. Цитирование полного предложения: Кэш НЕ ДОЛЖЕН хранить ответ на любой запрос, кроме: [список причин]. Дополнительные сведения о кешируемых кодах состояния HTTP см. В моем ответе. - person cassiomolin; 09.09.2016