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.
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.