Problema: Nginx elimina los encabezados HTTP con guiones bajos
Nginx, un servidor web y proxy inverso, elimina por defecto los encabezados HTTP que contienen guiones bajos. Esto puede causar problemas al usar encabezados personalizados o servicios de terceros que utilizan encabezados con guiones bajos, lo que puede resultar en pérdida de datos o problemas en las aplicaciones web.
Manejo predeterminado de encabezados con guiones bajos en Nginx
La eliminación silenciosa: Comportamiento predeterminado de Nginx
Nginx elimina los encabezados con guiones bajos por defecto. Esto ocurre sin ninguna advertencia o mensaje de error. Cuando Nginx recibe una solicitud con encabezados que contienen guiones bajos, los elimina antes de enviar la solicitud al servidor o aplicación backend. Esta eliminación puede causar problemas en las aplicaciones web que usan estos encabezados personalizados para funcionalidades o transferencia de datos.
La naturaleza oculta de este proceso dificulta que los desarrolladores y administradores de sistemas encuentren la causa de los problemas relacionados con la falta de datos en los encabezados. Los usuarios pueden pasar tiempo depurando sus aplicaciones sin saber que Nginx está eliminando sus encabezados personalizados. Este comportamiento predeterminado puede ser un problema al trabajar con servicios o APIs de terceros que utilizan encabezados con guiones bajos, ya que puede interrumpir el flujo de información entre sistemas.
Consejo: Verificar la configuración de Nginx
Para comprobar si Nginx está eliminando los encabezados con guiones bajos, puedes agregar un encabezado personalizado con un guion bajo en tu solicitud de cliente y luego usar un mecanismo de registro backend o una herramienta de depuración para verificar si el encabezado llega a tu aplicación. Si el encabezado falta, es probable que Nginx lo esté eliminando.
La causa raíz: Legado CGI y mapeo de encabezados
Contexto histórico: Variables CGI y conversión de encabezados
El comportamiento de Nginx de eliminar los encabezados con guiones bajos proviene del legado de la Interfaz de Entrada Común (CGI). CGI es un estándar antiguo para que los servidores web ejecuten programas externos y devuelvan su salida a los clientes web. Esto influyó en cómo los servidores web manejan los encabezados HTTP.
En CGI, los encabezados HTTP se convierten en variables de entorno para que los scripts las usen. Durante esta conversión, los guiones y guiones bajos en los nombres de los encabezados se cambian a guiones bajos. Por ejemplo, un encabezado como "Custom-Header" se convierte en "HTTP_CUSTOM_HEADER" como variable de entorno CGI. Este proceso puede crear confusión cuando los encabezados ya tienen guiones bajos.
Para evitar estas ambigüedades, Nginx elimina los encabezados con guiones bajos por defecto. Esta decisión previene problemas donde diferentes encabezados podrían mapearse al mismo nombre de variable CGI. Por ejemplo, "Custom_Header" y "Custom-Header" se convertirían ambos en "HTTP_CUSTOM_HEADER" en CGI, lo que haría poco claro a qué encabezado original representa la variable.
Aunque este enfoque resuelve el problema de ambigüedad, puede causar comportamientos inesperados en aplicaciones web modernas que no usan CGI y dependen de encabezados personalizados con guiones bajos. Entender este contexto histórico ayuda a explicar por qué Nginx maneja los encabezados que contienen guiones bajos de esta manera, aunque no siempre sea el comportamiento deseado en las prácticas actuales de desarrollo web.
Consejo: Manejo de encabezados con guiones bajos en Nginx
Para permitir encabezados con guiones bajos en Nginx, puedes usar la directiva underscores_in_headers on; en tu configuración de Nginx. Agrega esta línea a tu bloque server o location para habilitar el procesamiento de encabezados que contienen guiones bajos.
Estándares HTTP y convenciones de nombres de encabezados
Aclarando el RFC de HTTP
El RFC (Request for Comments) de HTTP permite el uso de guiones bajos en los nombres de los encabezados. Esto a menudo es malinterpretado por desarrolladores y administradores de sistemas. La especificación HTTP permite muchos caracteres en los nombres de los encabezados, incluidos los guiones bajos.
La confusión a menudo proviene de una mala interpretación de las reglas de caracteres ASCII en el RFC. La especificación HTTP/1.1 (RFC 2616) se refiere al RFC 822 para los formatos de campos de encabezado. El RFC 822 establece que los nombres de los campos deben usar caracteres ASCII imprimibles, que incluyen caracteres con valores decimales entre 33 y 126, excepto por los dos puntos. El carácter de guion bajo (valor decimal 95) está dentro de este rango permitido.
Algunos desarrolladores piensan que los guiones bajos no están permitidos porque ciertos servidores web, como Apache o Nginx, los tratan como inválidos por defecto. Sin embargo, esta es una elección específica del servidor, no un requisito del estándar HTTP.
Aunque los guiones bajos están permitidos en los nombres de los encabezados HTTP según el RFC, usarlos puede causar problemas con algunos servidores o proxies que no están configurados para manejarlos. Por esta razón, a menudo es mejor usar guiones en lugar de guiones bajos en los nombres de encabezados personalizados para evitar posibles problemas.
Consejo: Mejores prácticas para nombrar encabezados
Al crear encabezados HTTP personalizados, usa guiones en lugar de guiones bajos para mejorar la compatibilidad entre diferentes servidores y sistemas. Por ejemplo, usa "Custom-Header" en lugar de "Custom_Header".
Ejemplo: Compatibilidad de encabezados HTTP
Considera un escenario donde estás desarrollando una API que usa encabezados personalizados para transmitir información adicional. Podrías estar tentado a usar un encabezado como "API_Version" para indicar la versión de tu API. Sin embargo, para maximizar la compatibilidad, es mejor usar "API-Version" en su lugar. Esto asegura que tu encabezado será procesado correctamente por una gama más amplia de servidores e intermediarios.
Resolviendo el problema de los encabezados con guiones bajos en Nginx
Habilitando encabezados con guiones bajos: La solución de configuración
Para resolver el problema de Nginx eliminando los encabezados con guiones bajos, puedes usar la directiva 'underscores_in_headers on;' en tu configuración de Nginx. Esta directiva le dice a Nginx que acepte y pase los encabezados que contienen guiones bajos.
Para implementar esta solución, agrega la siguiente línea a tu configuración de Nginx:
underscores_in_headers on;
Puedes colocar esta directiva en diferentes ubicaciones dentro de tu archivo de configuración de Nginx, dependiendo de cuán ampliamente quieras aplicarla:
- Bloque server: Si quieres habilitar los encabezados con guiones bajos para un servidor específico, agrega la directiva dentro del bloque server. Por ejemplo:
server {
listen 80;
server_name ejemplo.com;
underscores_in_headers on;
# Otras configuraciones del servidor...
}
- Bloque http: Para habilitar los encabezados con guiones bajos para todos los servidores, coloca la directiva en el bloque http de tu configuración de Nginx:
http {
underscores_in_headers on;
# Otras configuraciones http...
}
- Bloque location: Si solo necesitas permitir encabezados con guiones bajos para ubicaciones específicas, agrega la directiva al bloque location relevante:
location /api {
underscores_in_headers on;
# Otras configuraciones de location...
}
Después de agregar la directiva, reinicia Nginx para aplicar los cambios. Esto permitirá que Nginx procese y pase los encabezados que contienen guiones bajos, resolviendo el problema de los encabezados personalizados faltantes en tus aplicaciones.
Recuerda probar tu configuración después de hacer estos cambios para asegurarte de que todo funcione como se espera.
Consejo: Verificar encabezados con guiones bajos
Después de habilitar los encabezados con guiones bajos en Nginx, puedes verificar si se están pasando correctamente usando una herramienta como cURL. Aquí tienes un ejemplo de comando:
curl -I -H "X_Custom_Header: ValorDePrueba" http://tu-dominio.com
Este comando envía una solicitud con un encabezado personalizado que contiene un guion bajo. Comprueba los encabezados de respuesta para confirmar que tu encabezado personalizado está presente y no ha sido eliminado por Nginx.





