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:
Pero el servidor responde solo con:
Solución: ajustar la ruta para que devuelva el tipo correcto.
2) Revisar idiomas y codificaciones
Si el navegador pide un idioma no disponible:
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:
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:
En Node.js:
Asegúrate de usar:
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:
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:
Esto permite entregar JSON correctamente.