В чем разница между кодом состояния 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 .

richleland
источник
Это также мое понимание ... именно поэтому я заявил в своем первоначальном посте, что я обновлял свою страницу несколько раз и все еще получаю "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 может использовать несколько серверов для предоставления контента, если эти серверы имеют разные конфигурации. Тогда эти статусы могут измениться. Надеюсь, поможет.

Saahithyan Vigneswaran
источник
304 - Not Modified не является «отклонением» сервером. Это сервер, который объявляет клиенту «для версии, которую вы запрашиваете, я знаю, что она не изменена, вам не нужен файл». Технически, 304 является одним из кодов ответа «перенаправление». Он говорит клиенту "получить его из собственного кэша".
Боб Кухар