Contenido

    Respuesta del servidor 304 Not Modified

    Código de estado HTTP 304 (Not Modified)

    El código de estado HTTP 304 es una señal enviada por el servidor que indica que el recurso solicitado no ha sido modificado desde la última vez que el cliente lo solicitó. Este código es fundamental para optimizar el proceso de almacenamiento en caché, ya que permite evitar la transferencia de datos innecesarios, mejorando así la eficiencia de la red.

    304 - Not Modified

    Características principales del código de estado 304

    • Definición y propósito: El código 304 se utiliza para indicar que un recurso no ha cambiado y que el cliente puede usar la versión en caché del recurso.
    • Mecanismo de caché: Funciona en conjunto con encabezados como If-Modified-Since e If-None-Match para determinar si el contenido en caché sigue siendo válido.
    • Condiciones para devolver 304: El servidor devuelve un 304 cuando el recurso solicitado no ha sido modificado desde la última vez que el cliente lo solicitó, según la información que este envía en sus encabezados.

    Ejemplos prácticos de uso del código 304

    Ejemplo de almacenamiento en caché de imágenes en un sitio web

    En un sitio web, las imágenes pueden ser grandes y ocupar mucho ancho de banda. Cuando un usuario visita una página por primera vez, el navegador solicita la imagen y la guarda en caché.

    • Cómo guarda el navegador la caché: El navegador almacena las imágenes junto con la fecha de la última modificación.
    • Comportamiento en solicitudes posteriores: En futuras solicitudes, el navegador envía un encabezado If-Modified-Since al servidor. Si la imagen no ha cambiado, el servidor responde con un 304, evitando la descarga del mismo archivo.

    Ejemplo con API

    Las APIs también pueden beneficiarse del código 304. Cuando un cliente realiza una solicitud a una API, puede incluir encabezados que permitan la verificación de cambios.

    • Optimización de solicitudes: Si la respuesta a una solicitud anterior no ha cambiado, el servidor devuelve un 304, ahorrando recursos tanto del servidor como del cliente.

    Ejemplo con encabezados If-Modified-Since e If-None-Match

    Estos encabezados son fundamentales para que el servidor determine si debe enviar un 304 o el recurso completo.

    • If-Modified-Since: Indica la fecha y hora de la última modificación del recurso que el cliente tiene en caché.
    • If-None-Match: Utiliza un valor de etag para verificar si el recurso ha cambiado.

    Solución de problemas con el código 304 en diferentes lenguajes de programación

    PHP

    En PHP, es esencial establecer correctamente los encabezados para habilitar el almacenamiento en caché.

    1. Establecer el encabezado Last-Modified.
    2. Comprobar si el encabezado If-Modified-Since coincide con el de la última modificación.
    3. Si coincide, devolver un 304.
    
    header("Last-Modified: " . gmdate("D, d M Y H:i:s", $lastModified) . " GMT");
    if (strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == $lastModified) {
        header("HTTP/1.1 304 Not Modified");
        exit();
    }
    

    Python (Flask)

    Flask facilita la gestión de la caché y el código 304.

    1. Configurar el almacenamiento en caché en la aplicación.
    2. Verificar las condiciones para el envío de un 304.
    
    from flask import Flask, request, make_response
    app = Flask(__name__)
    
    @app.route('/resource')
    def resource():
        last_modified = '2023-10-01'
        response = make_response('Contenido del recurso')
        response.headers['Last-Modified'] = last_modified
        if request.headers.get('If-Modified-Since') == last_modified:
            response.status_code = 304
            return response
        return response
    

    Node.js (Express)

    Express permite manejar el código 304 de manera sencilla.

    1. Configurar las rutas para los recursos.
    2. Verificar los encabezados del cliente para determinar si se debe devolver un 304.
    
    const express = require('express');
    const app = express();
    
    app.get('/resource', (req, res) => {
        const lastModified = new Date('2023-10-01').toUTCString();
        res.set('Last-Modified', lastModified);
        if (req.headers['if-modified-since'] === lastModified) {
            res.status(304).end();
        } else {
            res.send('Contenido del recurso');
        }
    });
    

    Errores comunes y cómo solucionarlos

    • Configuración incorrecta del almacenamiento en caché en el servidor: Asegúrese de que los encabezados de control de caché estén correctamente configurados.
    • Errores en los encabezados de solicitud: Verifique que los encabezados If-Modified-Since y If-None-Match se envían correctamente.
    • Comprobación y depuración del estado 304: Utilice herramientas de desarrollo del navegador para verificar la respuesta del servidor y los encabezados.