Skip to main content

🔎 Error 406 – Not Acceptable (No aceptable)

El error 406 ocurre cuando el servidor sí encuentra el recurso, pero no puede entregarlo en un formato aceptable según lo que el navegador o cliente solicita.

Esto suele estar relacionado con cabeceras como:

  • Accept:

  • Accept-Language:

  • Accept-Encoding:

  • Accept-Charset:

El cliente pide un formato, idioma o codificación que el servidor no puede proporcionar.


Causas más comunes

  • 🌐 El navegador o cliente solicita un formato no disponible (por ejemplo, pide JSON pero el servidor solo entrega HTML).

  • 🈚 Idioma o codificación no soportados (Accept-Language, Accept-Charset).

  • 💨 Compresiones o codificaciones incompatibles (gzip, br, deflate).

  • 🔧 Reglas de mod_negotiation o mod_security en Apache que filtran contenido.

  • 🧩 Configuraciones incorrectas en APIs que no devuelven el tipo MIME esperado.

  • ⚙️ Problemas en la negociación de contenido en frameworks como Laravel, Symfony, Django, Node.js.

  • 🔐 Filtros de seguridad que bloquean contenido sospechoso.


🔧 Soluciones recomendadas

1️⃣ Verificar el tipo de contenido solicitado

Ejemplo típico:

El cliente envía:


Accept: application/json

Pero el servidor responde solo con:


Content-Type: text/html

➡️ Solución: ajustar la ruta para que devuelva el tipo correcto.


2️⃣ Revisar idiomas y codificaciones

Si el navegador pide un idioma no disponible:


Accept-Language: jp

y tu sitio no lo soporta → 406.

Solución: permitir idiomas alternativos o eliminar restricciones.


3️⃣ Desactivar temporalmente mod_security / mod_negotiation

En servidores Apache, estos módulos pueden bloquear contenido.

En cPanel → ModSecurity → Desactivar (solo para pruebas)
Si el error desaparece, ajusta las reglas.


4️⃣ Revisar compresiones en el servidor

Si usas gzip o Brotli y el cliente no los acepta:


Accept-Encoding: identity

➡️ Necesitas desactivar compresión para esa petición o ajustar la configuración.


5️⃣ Corregir respuestas en APIs o frameworks

Ejemplo en Laravel:

Si tu ruta devuelve HTML cuando debería devolver JSON:


return response()->json([...]);

En Node.js:

Asegúrate de usar:


res.json({});

y no res.send() con HTML.


6️⃣ Probar desde otro navegador o con cURL

Esto ayuda a verificar qué está solicitando realmente el cliente.

Ejemplo:


curl -I -H "Accept: application/json" https://tusitio.com

🔐 Consejo Pro

Revisa la cabecera Accept: que envía el cliente y compárala con el Content-Type: que devuelve el servidor.

Si no coinciden → aparece el 406.

Ejemplo de solución rápida en Apache:


AddType application/json .json

Esto permite entregar JSON correctamente.