Вопрос по http-status-codes, caching, cache-control, http, httpwebrequest – В чем разница между кодом состояния HTTP 200 (кэш) и кодом состояния 304?

187

м с помощью Google "Скорость страницы » Плагин для Firefox для доступа к моему веб-сайту.

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

200 200 (кеш) 304

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

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

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

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

ОБНОВИТЬ:

Используя Google "Скорость страницы »Я получаю200 (кеш) заhttp://example.com/favicon.ico так же какhttp://cdn.example.com/js/ga.js

Но я получаю статус http304" заhttp://cdn.example.com/js/combined.min.js

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

Ваш Ответ

6   ответов
18

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

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

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

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

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

Справедливость, так почему же Firebug сообщает, что для ga.js извлекается из локального кэша (кэш статуса 200), в то время как комбинированный файл min.js сообщает о статусе HTTP 304. Какие'Странно то, что оба файла имеют одинаковый тип файла (JavaScript) и находятся в одном каталоге сервера. Вы могли бы подумать, что оба будут либо 200 или 304, а не разные Hank
HTML5 Boilerplate рекомендует не использовать метод строки запроса для очистки кэша - это 'лучше поменять,hrefurl, а такжеsrc ссылки на каждый файл, чтобы включить 'отпечатков пальцев» (либо хеш файла или простое увеличенное число), а затем скажите серверу удалить этот отпечаток и просто обработать его.style.css или что угодно. Если ты можешь'Чтобы сделать это на сервере, попросите систему сборки переименовать реальные файлы с помощью отпечатка пальца. iono
Вот различные методы обновления Firefoxwww-jo.se/f.pfleger/firefox-reload Josef Pfleger
@yitwail запутался. Вы имеете в виду, если пользователь нажимает на обновление, то онотриггеров / навязывает повторная проверка—приводя к304? ХОРОШО. Затем делатькакие приводит к200? КакиеДругой есть способ, который может вызвать запрос, который нене требует повторной проверки? Honey
61

200 (кеш) означает, что Firefox просто использует локально кэшированную версию..

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

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

2
Да, но favicon - это тоже файл,не серверный скрипт или что-то. x2.
Так же как и "200 (кеш) означает, что мой браузер должен был повторно загрузить весь контент снова, чтобы потом определить, нет изменилось с того что было в кеше? В идеале кажется, что я хотел бы 304 сообщений о состоянии, а не "200 (кеш) Hank
Мы обновили мой оригинальный пост, чтобы показать мой живой сайт и рассматриваемый JavaScript. Пожалуйста, смотрите мой обновленный оригинальный пост. Hank
1

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

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

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

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

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

Если срок действия файла не истек, то браузер будет использовать из кеша (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 - не модифицированный нет а "отказ» на сервере. Это сервер, декларирующий клиентудля версии, которую вы запрашиваете, я знаю, что она не изменена, вы неТ действительно нужен файл ", Технически, 304 является одним изперенаправление» коды ответов. Это говорит клиентуполучить его из собственного кэша ". Bob Kuhar
8

не модифицированный, Ваш веб-сервер в основном говорит браузеруэтот файл не имеетизменилось с момента последнего запроса. " В то время как HTTP 200 сообщает браузерувот успешный ответ - который должен быть возвращен, когда этоs либо в первый раз, когда ваш браузер обращается к файлу, либо при первом обращении к измененной копии.

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

200 на самом деле неозначает кэширование, это просто означает ОК. Скорее всего, ваша конфигурация сервера неt явно указывать браузеру кэшировать ваши файлы ico и js, чтобы он возвращал код состояния 200. richleland
Мы обновили мой оригинальный пост, чтобы показать мой живой сайт и рассматриваемый JavaScript. Пожалуйста, смотрите мой обновленный оригинальный пост. Hank
Тот'мое понимание также ... вот почему я заявил в своем оригинальном сообщении, что яя обновил мою страницу несколько раз и все еще получаю "200 (кеш) для того же favicon.ico и конкретного JavaScript у меня есть. Очень странно Hank
Тот'Это не относится к б / к на некоторых из моих JavaScript, я получаю 304, а другой JavaScript я получаю "200 (кеш), Весь JavaScript находится в одном каталоге веб-сервера example.com/js/ Hank
Я должен добавить, что 200 (кеш) просто означает, что этолокально кэшируется и фактически не выполняет запрос к серверу, что будет быстрее, чем обращение к серверу и получение ответа 304.I ' richleland

Похожие вопросы