Código de status HTTP · Erros do cliente (4xx)
Erro 406 Not Acceptable
O erro 406 Not Acceptable significa que o servidor não consegue gerar a resposta em nenhum formato, idioma ou codificação permitido pelos cabeçalhos Accept, e preferiu não mandar uma versão padrão. Normalmente vem de um cliente de API com Accept restrito, como Accept: application/xml para uma API que só fala JSON.
| Classe | 4xx, Erros do cliente |
|---|---|
| Definido em | RFC 9110 §15.5.7 |
| Pode ir para o cache por padrão | Só com Cache-Control ou Expires explícitos |
| Pode repetir o pedido | Sim, com cabeçalhos Accept, Accept-Language ou Accept-Encoding mais amplos |
| Cabeçalhos relevantes |
|
O que significa o 406
A RFC 9110, seção 15.5.7, liga o 406 à negociação proativa: o cliente lista o que consegue tratar em Accept, Accept-Language e Accept-Encoding, e o servidor não tem representação compatível nem quer mandar uma padrão. O servidor deveria listar as alternativas disponíveis no corpo da resposta.
A maioria dos servidores nunca envia 406 para navegadores. Navegadores mandam Accept terminando em */*, e servidores costumam ignorar preferências sem correspondência e devolver o formato padrão, o que a especificação permite. O código aparece em frameworks de API mais rígidos: o Spring MVC, por exemplo, lança HttpMediaTypeNotAcceptableException e responde 406 quando nenhum conversor gera o tipo pedido. Algumas hospedagens compartilhadas também configuram o ModSecurity para responder 406 a pedidos bloqueados, o que não tem relação com negociação.
Causas comuns
Se você está visitando o site
- Um módulo de segurança da hospedagem (muitas vezes o ModSecurity) barrou algo no pedido, como um campo de formulário ou a query string, e responde 406.
Se você administra o servidor
- O cliente envia Accept: application/xml, text/csv ou um tipo de fornecedor que o endpoint não gera.
- Um endpoint que devolve download de arquivo é chamado com Accept: application/json por um cliente HTTP genérico.
- Accept-Language ou Accept-Encoding restritos sem curinga, como Accept-Encoding: br, identity;q=0 num servidor sem Brotli.
Como resolver
Se você está visitando o site
- Tire caracteres incomuns ou trechos de código do que você digitou no formulário e tente de novo, depois avise o dono do site sobre o que disparou o erro.
Se você administra o servidor
- Envie um Accept documentado pelo endpoint, ou acrescente */* com q-value menor como reserva (Accept: application/json, */*;q=0.8).
- No servidor, prefira devolver a representação padrão em vez de 406, a não ser que um formato errado quebre o cliente.
- Se o ModSecurity for a origem, ache o ID da regra no log de auditoria e ajuste ou libere a regra para aquele caminho.
Como enviar um 406
app.get('/reports/:id/export', (req, res) => {
res.status(406).json({ error: 'Not acceptable', available: ['application/json', 'text/csv'] });
});// app/reports/[id]/export/route.ts
export async function GET() {
return Response.json(
{ error: 'Not acceptable', available: ['application/json', 'text/csv'] },
{ status: 406 }
);
}mux.HandleFunc("GET /reports/{id}/export", func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusNotAcceptable) // 406
w.Write([]byte(`{"error":"Not acceptable","available":["application/json","text/csv"]}`))
})from fastapi import FastAPI
from fastapi.responses import JSONResponse
app = FastAPI()
@app.get("/reports/{id}/export")
def export_report(id: str):
return JSONResponse(status_code=406, content={"error": "Not acceptable", "available": ["application/json", "text/csv"]})Costuma ser confundido com
- 406 vs 415
- O 415 trata do formato que o cliente enviou (Content-Type); o 406 trata do formato que o cliente quer receber (Accept).
- 406 vs 300
- O 300 Multiple Choices oferece várias representações para escolher; o 406 diz que nenhuma serve para o que foi pedido.
Perguntas frequentes
- Como resolver um 406 Not Acceptable de uma API?
- Confira o cabeçalho Accept que o cliente envia. Coloque um tipo documentado pela API, geralmente application/json, ou acrescente */*;q=0.8 para o servidor poder cair no formato padrão.
- Por que aparece erro 406 no WordPress ou em hospedagem compartilhada?
- Muitas hospedagens compartilhadas usam o ModSecurity com 406 como resposta para pedidos bloqueados. É uma regra de firewall, não negociação de conteúdo, e o suporte da hospedagem consegue dizer qual regra disparou.
- O 406 é a mesma coisa que o 415?
- Não. O 415 Unsupported Media Type recusa o formato do corpo enviado, definido pelo Content-Type. O 406 recusa os formatos que o cliente pediu para receber, definidos pelo Accept.
Revisado em por Arielton Oberek.