¿Cuál es la diferencia entre el código de estado HTTP 200 (caché) y el código de estado 304?

201

Estoy usando el complemento "Velocidad de página" de Google para Firefox para acceder a mi sitio web.

Algunos de los componentes de mi página se indican como estado HTTP:

200 200 (caché) 304

Por "Velocidad de página" de Google.

Lo que me confunde es la diferencia entre 200 (caché) y 304.

He actualizado la página varias veces (pero no he borrado mi caché) y siempre parece que mi favicon.ico y algunas imágenes tienen el estado = 200 (caché), mientras que otras imágenes tienen el estado http 304.

No entiendo por qué la diferencia.

ACTUALIZACIÓN :

Al usar la "Velocidad de página" de Google, recibo un "200 (caché)" para http://example.com/favicon.ico , así como http://cdn.example.com/js/ga.js

Pero recibo un estado http "304" para http://cdn.example.com/js/combined.min.js

No entiendo por qué tengo dos archivos JavaScript ubicados en el mismo directorio / js /, uno que devuelve un estado http 304 y el otro que devuelve un código de estado 200 (caché).

Madeja
fuente

Respuestas:

220

Los elementos con el código "200 (caché)" se cumplieron directamente desde la memoria caché de su navegador, lo que significa que las solicitudes originales de los elementos se devolvieron con encabezados que indican que el navegador podría almacenarlos en caché (por ejemplo, con fecha futura Expireso Cache-Control: max-ageencabezados), y que en el cada vez que activó la nueva solicitud, esos objetos almacenados en caché todavía se almacenaban en la memoria caché local y aún no habían expirado.

Los 304, por otro lado, son la respuesta del servidor después de que el navegador haya verificado si un archivo se modificó desde la última versión que había almacenado en caché (la respuesta es "no").

Para un rendimiento web óptimo, es mejor establecer un futuro lejano Expires:o un Cache-Control: max-ageencabezado para todos los activos, y luego, cuando un activo necesita ser cambiado, cambiar el nombre de archivo real del activo o agregar una cadena de versión a las solicitudes de ese activo. Esto elimina la necesidad de realizar cualquier solicitud a menos que el activo haya cambiado definitivamente de la versión en caché (no es necesaria esa respuesta 304). Google tiene más detalles sobre el uso correcto del almacenamiento en caché a largo plazo .

Ben Regenspan
fuente
2
Entonces, ¿qué es mejor tener desde una perspectiva de velocidad ... "200 (caché)" o "304" mensajes de estado http?
Hank el
22
200 caché Algunas buenas notas sobre esto aquí: developer.yahoo.com/performance/rules.html#expires . Desea el mayor tiempo posible de vencimiento de sus activos, pero tiene que equilibrar esto con el hecho de que pierde una cierta cantidad de control de esta manera. Una cosa que puede hacer es establecer vencimientos duraderos en los archivos, y luego, cuando sea necesario, incrementar el número de versión de un activo para esos archivos. Por ejemplo, puede incluir style.css? V1 e incrementar en el elemento <link> a style.css? V2 cuando haya cambios.
Ben Regenspan el
1
Justicia, entonces, ¿por qué Firebug informa que para el ga.js se extrae del caché local (estado = 200 caché) mientras el combinado.min.js informa un estado http 304. Lo extraño es que ambos archivos son del mismo tipo de archivo (JavaScript) y residen en el mismo directorio del servidor. Uno pensaría que ambos serían 200 o 304, y no diferentes
Hank el
8
Los encabezados max-agey agecombinados también pueden dar como resultado 200 (caché) si agees menor que max-age. La única excepción es cuando el usuario hace clic en el botón de actualización del navegador, en cuyo caso se envía un encabezado 304.
yitwail
2
Para HTML 5 no recomienda el uso del método de la cadena de consulta de cachebuster - es mejor cambiar el href, url,y srclas referencias a cada archivo para incluir una 'huella digital' (ya sea un hash del archivo o un número incrementado simple) y, a continuación, indicar al servidor quitar esa huella digital y simplemente servir style.csso lo que sea. Si no puede hacerlo en el servidor, haga que su sistema de compilación cambie el nombre de los archivos reales con la huella digital.
iono
62

200 (caché) significa que Firefox simplemente está utilizando la versión en caché local. Este es el más rápido porque no se realiza ninguna solicitud al servidor web.

304 significa que Firefox está enviando una solicitud condicional "If-Modified-Since" al servidor web. Si el archivo no se ha actualizado desde la fecha enviada por el navegador, el servidor web devuelve una respuesta 304 que esencialmente le dice a Firefox que use su versión en caché. No es tan rápido como 200 (caché) porque la solicitud aún se envía al servidor web, pero el servidor no tiene que enviar el contenido del archivo.

A su última pregunta, no sé por qué los dos archivos JavaScript en el mismo directorio están devolviendo resultados diferentes.

James Lawruk
fuente
18

Esto también me arrojó por mucho tiempo. Lo primero que verificaría es que no está recargando la página haciendo clic en el botón Actualizar, que siempre emitirá una solicitud condicional de recursos y devolverá 304s para muchos de los elementos de la página. En su lugar, vaya a la barra de direcciones, seleccione la página y presione Intro como si acabara de escribir la misma URL nuevamente, eso le dará un mejor indicador de lo que se está almacenando en caché correctamente. Este artículo hace un gran trabajo al explicar la diferencia entre las solicitudes condicionales e incondicionales y cómo los afecta el botón de actualización: http://blogs.msdn.com/b/ieinternals/archive/2010/07/08/technical-information-about- condicional-http-request-and-the-refresh-button.aspx

Perro
fuente
1
Ni siquiera puedo describir cuánto tiempo pasé tratando de averiguar el estado 304 de las solicitudes a CDN. Aunque respondes una pregunta un poco diferente, mereces una recompensa :-)
Peeech
Tienes razón: la diferencia en los códigos está relacionada con el hecho de que estás recargando o no la misma página. Si vuelvo a cargar una página, veo en el monitor de red del navegador un código 304. Pero, si accedo a otra URL, que usa estos mismos archivos, veo en el monitor de red del navegador un código 200 (de caché). En mi caso, la otra URL era solo una cadena de consulta adjunta a la URL original (la página era esencialmente lo mismo).
aldemarcalazans
8

HTTP 304 no está "modificado". Su servidor web básicamente le dice al navegador "este archivo no ha cambiado desde la última vez que lo solicitó". Mientras que un HTTP 200 le dice al navegador "aquí hay una respuesta exitosa", que debe devolverse cuando sea la primera vez que su navegador accede al archivo o la primera vez que se accede a una copia modificada.

Para obtener más información sobre los códigos de estado, visite http://en.wikipedia.org/wiki/List_of_HTTP_status_codes .

Richleland
fuente
Eso también lo entiendo ... y es por eso que dije en mi publicación original que he actualizado mi página varias veces y todavía obtengo el "200 (caché)" para el mismo favicon.ico y el JavaScript particular que tengo. Muy extraño
Hank el
2
200 en realidad no significa en caché, solo significa que está bien. Lo más probable es que la configuración de su servidor no le diga explícitamente al navegador que guarde en caché sus archivos ico y js, lo que lo haría devolver un código de estado de 200.
richleland 03 de
Ese no es el caso b / c en algunos de mis JavaScript, recibo un 304 y otro JavaScript obtengo un "200 (caché)". Todo JavaScript reside dentro del mismo directorio de servidor web example.com/js/
Hank
Debo agregar que 200 (caché) solo significa que está almacenado en caché localmente y no está haciendo una solicitud al servidor, lo que será más rápido que ir al servidor y obtener una respuesta 304.
richleland el
He actualizado mi publicación original para mostrar mi sitio en vivo y el JavaScript en cuestión. Por favor, vea mi publicación original actualizada.
Hank el
2

Para su última pregunta, ¿por qué? Trataré de explicar con lo que sé

Una breve explicación de esos tres códigos de estado en términos simples.

  • 200 - éxito (solicitudes del navegador y obtener el archivo del servidor)

Si el almacenamiento en caché está habilitado en el servidor

  • 200 (de la memoria caché): archivo encontrado en el navegador, por lo que el navegador no va a solicitarlo del servidor
  • 304: el navegador solicita un archivo pero el servidor lo rechaza

Para algunos archivos, el navegador decide solicitar del servidor y para algunos decide leer de los archivos almacenados (en caché). Por qué es esto ? Todos los archivos tienen una fecha de caducidad, así que

Si un archivo no caduca, el navegador lo usará desde la caché (200 caché).

Si el archivo ha caducado, el navegador solicita al servidor un archivo. Archivo de verificación del servidor en ambos lugares (navegador y servidor). Si se encuentra el mismo archivo, el servidor rechaza la solicitud. Según el protocolo, el navegador utiliza el archivo existente.

mira esta configuración nginx

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

    ...
}

Aquí la caducidad se establece en 60 segundos, por lo que todos los archivos estáticos se almacenan en caché durante 60 segundos. Entonces, si solicita un archivo nuevamente dentro de los 60 segundos, el navegador leerá de la memoria (200 de memoria). Si solicita después de 60 segundos, el navegador solicitará el servidor (304).

Supuse que el archivo no cambia después de 60 segundos, en ese caso obtendría 200 (es decir, el archivo actualizado se obtendrá del servidor).

Por lo tanto, si los servidores están configurados con diferentes encabezados (políticas) que expiran y almacenan en caché, el estado puede diferir.

En su caso, está utilizando cdn, el objetivo principal de cdn es la alta disponibilidad y la entrega rápida. Por lo tanto, usan múltiples servidores. Aunque parece que los archivos están en el mismo directorio, cdn podría usar múltiples servidores para proporcionar contenido, si esos servidores tienen configuraciones diferentes. Entonces estos estados pueden cambiar. Espero eso ayude.

Saahithyan Vigneswaran
fuente
El 304 - No modificado no es un "rechazo" por parte del servidor. Es el servidor que declara al cliente "para la versión que está solicitando, sé que no está modificado, realmente no necesita el archivo". Técnicamente, 304 es uno de los códigos de respuesta de "redirección". Le dice al cliente "obténgalo de su propio caché".
Bob Kuhar