Entendiendo la Respuesta 304 Not Modified
en el Caché HTTP
Al desarrollar aplicaciones web, la gestión eficiente de los recursos es crucial para el rendimiento, especialmente cuando se trata de acceso a archivos y caché del navegador. Una forma de optimizar este proceso es utilizando correctamente la respuesta HTTP 304 Not Modified
. Esta respuesta informa al navegador que el recurso que solicitó no ha cambiado desde la última vez que se recuperó, permitiendo al navegador seguir utilizando su versión en caché en lugar de volver a descargarlo. Pero, ¿cómo saber cuándo enviar esta respuesta? Desglosémoslo paso a paso.
Encabezados HTTP Clave a Verificar
Para determinar si debes enviar una respuesta 304 Not Modified
, debes verificar encabezados HTTP específicos enviados por el navegador del cliente. Los dos encabezados principales en los que debes enfocarte son:
- Etag: Este encabezado sirve como un identificador único para un recurso en una versión específica. El navegador compara su Etag almacenado en caché con el Etag del servidor para ver si coinciden.
- If-None-Match: Este encabezado es enviado por el navegador y contiene el valor Etag almacenado en caché. Si el recurso no ha cambiado, el servidor puede responder con
304
.
Qué Buscar
- Si existe el Etag del navegador: Si el navegador incluye los encabezados
Etag
oIf-None-Match
en la solicitud, indica que tiene una versión del recurso previamente almacenada en caché. - Consideraciones sobre las comillas: A veces, los navegadores colocan comillas alrededor del valor Etag. Asegúrate de eliminar estas comillas antes de realizar la comparación.
Encabezados Necesarios para la Respuesta Inicial
Al enviar inicialmente el recurso (típicamente con una respuesta 200 OK
), es esencial incluir encabezados relevantes que informen al navegador sobre el estado del recurso:
- Last-Modified: Indica la última vez que se cambió el recurso. Esto puede ser un chequeo alternativo para la validación de la caché junto al Etag.
- Etag (como se mencionó anteriormente): Este debe ser generado para el recurso e incluido en los encabezados de respuesta para facilitar futuras validaciones de caché.
Implementando la Lógica
Aquí hay un ejemplo simplificado de pseudocódigo que demuestra cómo implementar la lógica para enviar una respuesta 304 Not Modified
:
server_etag = gen_etag_for_this_file(myfile)
etag_from_browser = get_header("Etag")
if etag_from_browser does not exist:
etag_from_browser = get_header("If-None-Match")
if the browser has quoted the etag:
strip the quotes (e.g. "foo" --> foo)
set server_etag into http header
if etag_from_browser matches server_etag
send 304 return code to browser
Ejemplo de Fragmento de Lógica del Servidor
Aquí hay una manera en que podrías implementar esto en la lógica de tu servidor:
/* el cliente debe establecer ya sea Etag o If-None-Match */
mketag(etag, &sb);
etagin = apr_table_get(r->headers_in, "Etag");
if (etagin == NULL)
etagin = apr_table_get(r->headers_in, "If-None-Match");
if (etag != NULL && etag[0] == '"') {
/* Eliminar comillas si están presentes */
int sl;
sl = strlen(etag);
memmove(etag, etag+1, sl+1);
etag[sl-2] = 0;
}
apr_table_add(r->headers_out, "ETag", etag);
if (etagin != NULL && strcmp(etagin, etag) == 0) {
/* Si el etag coincide, devolver un estado 304 */
rc = HTTP_NOT_MODIFIED;
}
Reflexiones Finales
Al saber cómo y cuándo enviar una respuesta 304 Not Modified
, puedes reducir eficazmente la carga del servidor y mejorar la experiencia del usuario. No olvides la importancia de incluir los encabezados Etag
y Last-Modified
durante la respuesta inicial para permitir que el cliente realice solicitudes precisas de validación de caché más adelante. Si tienes preguntas sobre la generación de Etag o necesitas más ayuda con la implementación, no dudes en contactarnos para obtener ejemplos más detallados. ¡Feliz codificación!