В чем разница между кодом состояния HTTP 200 (кэш) и кодом состояния 304?


201

Я использую плагин Google Page Speed ​​для Firefox для доступа к моему веб-сайту.

Некоторые компоненты на моей странице обозначены как статус HTTP:

200 200 (кеш) 304

По Google "Скорость страницы".

Что меня смущает, так это разница между 200 (кеш) и 304.

Я обновлял страницу несколько раз (но не очищал кэш), и всегда кажется, что мой favicon.ico и несколько изображений имеют статус 200 (кэш), в то время как некоторые другие изображения имеют статус HTTP 304.

Я не понимаю, почему разница.

ОБНОВЛЕНИЕ :

Используя Google «Page Speed», я получаю «200 (кеш)» для http://example.com/favicon.ico, а также http://cdn.example.com/js/ga.js

Но я получаю http статус «304» для http://cdn.example.com/js/combined.min.js

Я не понимаю, почему у меня есть два JavaScript-файла, расположенных в одной директории / js /, один возвращает HTTP-статус 304, а другой возвращает 200 (кэш) код состояния.

Ответы:


220

Элементы с кодом «200 (кеш)» были выполнены непосредственно из кеша вашего браузера. Это означает, что исходные запросы на элементы были возвращены с заголовками, указывающими, что браузер может их кешировать (например, в будущем Expiresили в Cache-Control: max-ageзаголовках), и что на во время запуска нового запроса эти кэшированные объекты все еще хранились в локальном кеше и еще не истекли.

304, с другой стороны, являются ответом сервера после того, как браузер проверил, был ли файл изменен с момента последней кешированной версии (ответ «нет»).

Для наиболее оптимальной веб-производительности лучше всего задать далекое будущее Expires:или Cache-Control: max-ageзаголовок для всех активов, а затем, когда необходимо изменить актив, изменить фактическое имя файла актива или добавить строку версии к запросам для этого актива. Это устраняет необходимость в выполнении любого запроса, если только ресурс определенно не изменился по сравнению с версией в кэше (для этого ответа 304 не требуется). У Google есть больше деталей о правильном использовании долгосрочного кэширования .


2
Итак, что лучше иметь с точки зрения скорости ... HTTP-сообщения «200 (кэш)» или «304»?
Хэнк

22
200 кеш. Несколько хороших заметок по этому поводу здесь: developer.yahoo.com/performance/rules.html#expires . Вы хотите как можно более длительный срок действия своих активов, но должны сбалансировать это с тем фактом, что таким образом вы теряете определенную степень контроля. Одна вещь, которую вы можете сделать, это установить длительный срок действия файлов, а затем при необходимости увеличить номер версии ресурса для этих файлов. Например, вы можете включить style.css? V1 и увеличить его в элементе <link> до style.css? V2, если есть изменения.
Бен Регенспан

1
Справедливость, так почему же Firebug сообщает, что для ga.js извлекается из локального кэша (кэш статуса 200), в то время как комбинированный файл min.js сообщает о статусе HTTP 304. Что странно, так это то, что оба файла имеют одинаковый тип файла (JavaScript) и находятся в одном каталоге сервера. Вы могли бы подумать, что оба будут либо 200 или 304, а не разные
Хэнк

8
Объединенные заголовки max-ageи ageмогут также привести к 200 (кэш) результатам, если ageменьше max-age. Единственное исключение - когда пользователь нажимает кнопку обновления браузера, и в этом случае отправляется заголовок 304.
Yitwail

2
HTML5 Шаблонный рекомендует не использовать строки запроса в кэш-перебора - это лучше изменить href, url,и srcссылки на каждый файл , чтобы включить «отпечаток пальца» (либо хэш файла или простой порядковым номером), а затем сообщить серверу снять этот отпечаток и просто служить style.cssили что-то еще. Если вы не можете сделать это на сервере, попросите систему сборки переименовать реальные файлы с помощью отпечатка пальца.
Ионо

62

200 (кеш) означает, что Firefox просто использует локально кэшированную версию. Это самый быстрый способ, поскольку к веб-серверу не обращаются.

304 означает, что Firefox отправляет условный запрос «If-Modified-Since» на веб-сервер. Если файл не обновлялся с даты, отправленной браузером, веб-сервер возвращает ответ 304, который, по сути, указывает Firefox использовать его кэшированную версию. Это не так быстро, как 200 (кэш), потому что запрос все еще отправляется на веб-сервер, но сервер не должен отправлять содержимое файла.

На ваш последний вопрос, я не знаю, почему два файла JavaScript в одном каталоге дают разные результаты.


18

Это бросило меня на долгое время тоже. Первое, что я хотел бы проверить, это то, что вы не перезагружаете страницу, нажимая кнопку обновления, которая всегда выдаст условный запрос ресурсов и вернет 304 для многих элементов страницы. Вместо этого перейдите к строке URL, выберите страницу и нажмите Enter, как будто вы только что ввели тот же URL, что даст вам лучший индикатор того, что кэшируется правильно. Эта статья прекрасно объясняет разницу между условными и безусловными запросами и то, как кнопка обновления влияет на них: http://blogs.msdn.com/b/ieinternals/archive/2010/07/08/technical-information-about- условные-HTTP-запросы-и-обновления-button.aspx-


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

Вы правы: разница в кодах связана с тем, что вы перезагружаете или не ту же страницу. Если я перезагружаю страницу, я вижу в сетевом мониторе браузера код 304. Но если я получаю доступ к другому URL, который использует те же файлы, я вижу в мониторе сети браузера код 200 (из кэша). В моем случае другой URL был просто строкой запроса, добавленной к исходному URL (страница была по сути то же самое).
aldemarcalazans

8

HTTP 304 "не изменен". Ваш веб-сервер в основном сообщает браузеру: «Этот файл не изменился с момента последнего запроса». Принимая во внимание, что HTTP 200 сообщает браузеру «вот успешный ответ», который должен быть возвращен, когда ваш браузер обращается к файлу в первый раз или при обращении к измененной копии.

Для получения дополнительной информации о кодах состояния посетите http://en.wikipedia.org/wiki/List_of_HTTP_status_codes .


Это также мое понимание ... именно поэтому я заявил в своем первоначальном посте, что я обновлял свою страницу несколько раз и все еще получаю "200 (кеш)" для того же favicon.ico и конкретного JavaScript, который у меня есть. Очень странно
Хэнк

2
200 на самом деле не означает кеширование, это просто значит ОК. Скорее всего, конфигурация вашего сервера не указывает браузеру явно кэшировать ваши файлы ico и js, что заставит его вернуть код состояния 200.
richleland

Это не относится к б / к на некоторых моих JavaScript, я получаю 304, а на другом JavaScript я получаю «200 (кеш)». Весь JavaScript находится в одном каталоге веб-сервера example.com/js/
Хэнк,

Я должен добавить, что 200 (кеш) просто означает, что он локально кешируется и фактически не выполняет запрос к серверу, что будет быстрее, чем обращение к серверу и получение ответа 304.
Ричлэнд

Я обновил свой оригинальный пост, чтобы показать мой живой сайт и рассматриваемый JavaScript. Пожалуйста, смотрите мой обновленный оригинальный пост.
Хэнк

2

На ваш последний вопрос, почему? Я постараюсь объяснить, что я знаю

Краткое объяснение этих трех кодов состояния в терминах непрофессионала.

  • 200 - успех (запросы браузера и получение файла с сервера)

Если на сервере включено кеширование

  • 200 (из кеша памяти) - файл найден в браузере, поэтому браузер не отправляет запрос с сервера
  • 304 - браузер запрашивает файл, но он отклоняется сервером

Для некоторых файлов браузер решает запросить с сервера, а для некоторых - для чтения из сохраненных (кэшированных) файлов. Почему это ? Каждый файл имеет срок годности, поэтому

Если срок действия файла не истек, то браузер будет использовать из кеша (200 кеш).

Если срок действия файла истек, браузер запрашивает файл у сервера. Файл проверки сервера в обоих местах (браузер и сервер). Если тот же файл найден, сервер отклоняет запрос. Согласно протоколу браузер использует существующий файл.

посмотрите на эту конфигурацию nginx

location / {
    add_header Cache-Control must-revalidate;
    expires     60;
    etag on;

    ...
}

Здесь истекает 60 секунд, поэтому все статические файлы кэшируются в течение 60 секунд. Таким образом, если вы запросите файл снова в течение 60 секунд, браузер будет читать из памяти (200 памяти). Если вы запросите через 60 секунд, браузер запросит сервер (304).

Я предполагал, что файл не будет изменен через 60 секунд, в этом случае вы получите 200 (т.е. обновленный файл будет загружен с сервера).

Таким образом, если серверы настроены с разными заголовками (политиками) с истекающим сроком действия и кэшированием, состояние может отличаться.

В вашем случае вы используете cdn, основное назначение cdn - это высокая доступность и быстрая доставка. Поэтому они используют несколько серверов. Даже если кажется, что файлы находятся в одном каталоге, cdn может использовать несколько серверов для предоставления контента, если эти серверы имеют разные конфигурации. Тогда эти статусы могут измениться. Надеюсь, поможет.


304 - Not Modified не является «отклонением» сервером. Это сервер, который объявляет клиенту «для версии, которую вы запрашиваете, я знаю, что она не изменена, вам не нужен файл». Технически, 304 является одним из кодов ответа «перенаправление». Он говорит клиенту "получить его из собственного кэша".
Боб Кухар
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.