Conteúdo

    Resposta do servidor 304 Not Modified

    Características principais do código de status HTTP 304

    O código de status HTTP 304 (Not Modified) é uma resposta do servidor que indica que o recurso solicitado não foi modificado desde a última vez que foi acessado pelo cliente. Este código é fundamental para otimizar o uso de cache, evitando a transferência de dados que não sofreram alterações.

    304 - Not Modified

    Definição e finalidade

    O código 304 serve para informar ao cliente que ele pode continuar usando a versão em cache do recurso, pois não houve modificações. Isso reduz a quantidade de dados transferidos e melhora a eficiência da comunicação entre cliente e servidor.

    Como funciona o mecanismo de cache utilizando 304

    Quando um navegador faz uma solicitação, ele pode incluir cabeçalhos que indicam quando o recurso foi acessado pela última vez. Se o servidor determinar que o recurso não foi alterado desde essa data, ele responde com o código 304, sinalizando que o navegador pode usar a versão em cache.

    Condições em que o servidor retorna o status 304

    • Quando o cabeçalho If-Modified-Since é enviado pelo cliente.
    • Quando o cabeçalho If-None-Match é utilizado para verificar a integridade do recurso.
    • Quando o servidor não detecta mudanças no recurso desde o último acesso.

    Exemplos práticos de uso do código de status 304

    Exemplo de cache de imagens em um site

    Quando um usuário acessa um site que contém imagens, o navegador armazena essas imagens em cache. Se o usuário visitar o site novamente, o navegador enviará uma solicitação com o cabeçalho If-Modified-Since. Se a imagem não tiver sido alterada, o servidor responderá com o código 304.

    Comportamento durante uma nova solicitação

    Ao receber um status 304, o navegador utiliza a versão em cache da imagem, evitando o download desnecessário e economizando largura de banda.

    Exemplo com cabeçalhos If-Modified-Since e If-None-Match

    Esses cabeçalhos são fundamentais para o funcionamento do código 304. O cabeçalho If-Modified-Since informa ao servidor a última vez que o recurso foi acessado, enquanto If-None-Match utiliza um identificador único (ETag) para verificar se o recurso foi modificado.

    Como corrigir problemas com o código 304 em diferentes linguagens de programação

    PHP

    Para implementar corretamente o código 304 em PHP, é necessário definir os cabeçalhos de cache adequadamente.

    
    header("Cache-Control: public, max-age=3600");
    header("Last-Modified: " . gmdate("D, d M Y H:i:s", filemtime("seu_arquivo")) . " GMT");
    if (strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == filemtime("seu_arquivo")) {
        header("HTTP/1.1 304 Not Modified");
        exit;
    }
    

    Python (Flask)

    No Flask, a configuração do cache e a manipulação do status 304 podem ser feitas facilmente com decorators.

    
    from flask import Flask, request, make_response
    import os
    app = Flask(__name__)
    
    @app.route('/seu_recurso')
    def seu_recurso():
        last_modified = os.path.getmtime("seu_arquivo")
        response = make_response("Conteúdo do recurso")
        response.headers['Last-Modified'] = last_modified
        if request.headers.get('If-Modified-Since') == str(last_modified):
            response.status_code = 304
        return response
    

    Node.js (Express)

    Para lidar com solicitações usando o status 304 no Express, é necessário verificar os cabeçalhos recebidos.

    
    const express = require('express');
    const app = express();
    const fs = require('fs');
    
    app.get('/seu_recurso', (req, res) => {
        const stat = fs.statSync('seu_arquivo');
        const lastModified = stat.mtime.toUTCString();
        res.setHeader('Last-Modified', lastModified);
        if (req.headers['if-modified-since'] === lastModified) {
            res.status(304).end();
        } else {
            res.send('Conteúdo do recurso');
        }
    });
    

    Erros comuns e como resolvê-los

    Configuração incorreta do cache no servidor

    Uma configuração inadequada pode levar a problemas de cache. Verifique se os cabeçalhos estão sendo definidos corretamente e que os recursos estão acessíveis.

    Erros nos cabeçalhos de solicitação

    Certifique-se de que os cabeçalhos If-Modified-Since e If-None-Match estão sendo enviados corretamente. Um erro comum é a falta de formatação adequada nas datas.

    Como verificar e depurar o status 304

    Para depurar problemas com o status 304, utilize ferramentas de desenvolvedor do navegador para inspecionar as solicitações e respostas HTTP, observando os cabeçalhos e os códigos de status retornados pelo servidor.