Чим відрізняється код статусу HTTP 200 (кеш) від коду статусу 304?


201

Я використовую плагін Google "Швидкість сторінки" для Firefox для доступу до свого веб-сайту.

Деякі компоненти на моїй сторінці вказані як статус HTTP:

200 200 (кеш) 304

За допомогою "Швидкість сторінки" від Google.

Що мене бентежить - це різниця між 200 (кеш) і 304.

Я кілька разів оновлював сторінку (але не очищав кеш), і завжди здається, що мій favicon.ico та кілька зображень є статусом = 200 (кеш), тоді як деякі інші зображення мають статус 304 http.

Я не розумію, чому різниця.

ОНОВЛЕННЯ :

Використовуючи Google "Швидкість сторінки", я отримую "200 (кеш)" для http://example.com/favicon.ico , а також http://cdn.example.com/js/ga.js

Але я отримую http-статус "304" для http://cdn.example.com/js/combined.min.js

Я не розумію, чому у мене в одному каталозі / js / два файли JavaScript, один повертає статус 304 http, а інший повертає код статусу 200 (кеш).

Відповіді:


220

Елементи з кодом "200 (кеш)" виконувались безпосередньо з кешу веб-переглядача, тобто початкові запити на елементи поверталися із заголовками, що вказують, що браузер може кешувати їх (наприклад, датованими Expiresабо Cache-Control: max-ageзаголовками), а також у Після запуску нового запиту ці кешовані об’єкти все ще зберігалися в локальному кеші і ще не закінчилися.

304s, з іншого боку, - це відповідь сервера після того, як браузер перевірив, чи був файл змінений з часу останньої версії, в яку він був кешований (відповідь "ні").

Для найбільш оптимальної продуктивності в Інтернеті найкраще встановити далеке майбутнє Expires:або Cache-Control: max-ageзаголовок для всіх активів, а потім, коли потрібно змінити актив, змінивши фактичне ім'я файлу або додавши рядок версії до запитів цього ресурсу. Це позбавляє від необхідності робити будь-який запит, якщо актив не остаточно змінився з кешованої версії (немає необхідності в цьому відповіді 304). У Google є детальніше про правильне використання довготривалого кешування .


2
Отже, що краще мати зі швидкісного погляду ... "200 (кеш)" або "304" повідомлення про статус http?
Ганк

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

1
Справедливість, тому чому Firebug повідомляє, що для ga.js витягується з локального кешу (статус = 200 кеш-пам'яті), тоді як united.min.js повідомляє про статус 304 http. Що дивно, що обидва файли одного типу файлів (JavaScript) і містяться в одному каталозі сервера. Ви б могли подумати, що обидва будуть або 200, або 304, а не різними
Хенк

8
max-ageІ ageзаголовки в поєднанні також може привести до 200 (кеш) результатів , якщо ageменше max-age. Єдиний виняток - коли користувач натискає кнопку оновлення браузера, і в цьому випадку надсилається заголовок 304.
yitwail

2
HTML5 Boilerplate рекомендує не застосовувати рядок запиту методу перебору кешу - краще змінити 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. Хоча ви відповідаєте на дещо інше запитання, ви заслуговуєте на винагороду :-)
Peeech

Ви маєте рацію: різниця в кодах пов'язана з тим, що ви перезавантажуєте сторінку чи не ту саму сторінку. Якщо я перезавантажую сторінку, я бачу в моніторі мережі браузера 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

Це не стосується b / c у деяких моїх JavaScript, я отримую 304, а інші JavaScript отримую "200 (кеш)". Весь JavaScript знаходиться в одному і тому ж каталозі веб-серверів example.com/js/
Hank

Я мушу додати, що 200 (кеш) просто означає, що він кешований локально і насправді не робить запит на сервер, що буде швидше, ніж зайти на сервер і отримати відповідь 304.
richleland

Я оновив свій оригінальний пост, щоб показати мій веб-сайт у реальному часі та 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 - Не змінено - це не "відхилення" сервером. Це сервер, який заявляє клієнтові "для тієї програми, яку ви просите. Я знаю, що вона не модифікована, файл вам дійсно не потрібен". Технічно 304 - це один з кодів відповідей "перенаправлення". Це говорить клієнту "дістань його з власного кешу".
Боб Кухар
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.