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

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

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

200 200 (кеш) 304

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

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

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

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

UPDATE

Используя Google "Скорость страницы" , я получаю "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 (кеш).

Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

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