¿Cómo leer un header personalizado de un servidor upstream en Nginx?

Publicado 17 de octubre de 2024

Problema: Leer encabezados personalizados de servidores upstream en Nginx

Nginx, un servidor web y proxy inverso, a veces necesita acceder a encabezados personalizados de servidores upstream. Estos encabezados pueden contener información importante para el procesamiento de solicitudes o el registro. Por defecto, Nginx no expone ni transmite automáticamente todos los encabezados upstream, lo que puede ser un problema para los administradores que necesitan estos datos.

Solución de Nginx para leer encabezados personalizados

Uso de variables de Nginx para acceder a encabezados

Nginx ofrece una forma de acceder a encabezados personalizados de servidores upstream. Este método utiliza variables de Nginx, que son valores que se pueden usar en diferentes partes de la configuración de Nginx.

Para acceder a encabezados personalizados, Nginx utiliza un prefijo: $senthttp. Este prefijo permite crear variables que coincidan con encabezados específicos enviados por el servidor upstream. El prefijo va seguido del nombre del encabezado al que desea acceder, reemplazando los guiones por guiones bajos.

Por ejemplo, para acceder a un encabezado personalizado llamado "My-Custom-Header", usaría la variable de Nginx $sent_http_My_Custom_Header. Esta variable contendrá el valor del "My-Custom-Header" enviado por el servidor upstream.

Este método funciona para cualquier encabezado personalizado, lo que lo convierte en una herramienta útil para los administradores de Nginx que necesitan trabajar con diferentes tipos de respuestas de servidores upstream.

Ejemplo: Registrar encabezados personalizados

Para registrar el valor de un encabezado personalizado en el log de acceso de Nginx, puede agregarlo a la directiva log_format en su configuración de Nginx:

log_format custom '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$sent_http_My_Custom_Header"';

access_log /var/log/nginx/access.log custom;

Esta configuración incluirá el valor de "My-Custom-Header" en cada entrada del log.

Guía paso a paso para leer encabezados personalizados

Identificar el encabezado personalizado

Para leer encabezados personalizados en Nginx, debe encontrar el encabezado en la respuesta del servidor upstream. Los encabezados personalizados suelen ser añadidos por el servidor upstream (como Apache o un servidor de aplicaciones) para proporcionar información adicional.

En este ejemplo, el encabezado personalizado es:

My-custom-header: 1

Este encabezado es parte de la respuesta HTTP del servidor upstream. Tenga en cuenta el nombre y el formato del encabezado personalizado, ya que necesitará esta información para acceder a él en Nginx.

Consejo: Convenciones de nomenclatura de encabezados

Al crear encabezados personalizados, use una convención de nomenclatura consistente. Una práctica común es prefijar sus encabezados personalizados con 'X-' (por ejemplo, X-My-Custom-Header). Esto ayuda a distinguirlos de los encabezados HTTP estándar y evita posibles conflictos.

Construir la variable de Nginx

Después de encontrar el encabezado personalizado, debe crear la variable de Nginx correcta para acceder a su valor. Nginx utiliza un formato específico para las variables que representan encabezados de respuesta:

  1. Comience con el prefijo $sent_http_
  2. Agregue el nombre del encabezado, reemplazando guiones con guiones bajos
  3. El nombre de la variable no distingue entre mayúsculas y minúsculas

Para el encabezado personalizado "My-custom-header", la variable de Nginx correcta sería:

$sent_http_My_custom_header

Esta variable contendrá el valor del "My-custom-header" enviado por el servidor upstream. En este caso, contendría el valor "1".

Implementar el encabezado personalizado en la configuración de Nginx

Agregar el encabezado al bloque de ubicación de Nginx

Para utilizar la variable del encabezado personalizado en un bloque de ubicación, agréguela a su archivo de configuración de Nginx. Esto le permite acceder al valor del encabezado dentro de esa ubicación.

Así es como se utiliza la variable del encabezado personalizado en un bloque de ubicación:

location / {
    proxy_pass http://backend;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;

    # Acceder al valor del encabezado personalizado
    add_header X-Custom-Header-Value $sent_http_My_custom_header;
}

En esta configuración, el valor del encabezado personalizado "My-custom-header" del servidor upstream se agrega a la respuesta enviada al cliente utilizando la directiva add_header.

Consejo: Registrar encabezados personalizados

Para solucionar problemas o monitorear encabezados personalizados, puede registrarlos en el log de acceso de Nginx:

log_format custom '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$sent_http_My_custom_header"';

access_log /var/log/nginx/access.log custom;

Esto incluirá el valor del encabezado personalizado en cada entrada del log, facilitando su seguimiento y depuración.

Usar encabezados personalizados en declaraciones condicionales

Puede utilizar valores de encabezados personalizados en declaraciones condicionales en su configuración de Nginx. Esto le permite tomar decisiones basadas en el valor del encabezado.

Aquí hay ejemplos de cómo usar encabezados personalizados en lógica condicional:

  1. Redirigir basado en el valor del encabezado:
location / {
    if ($sent_http_My_custom_header = "1") {
        return 301 /special-page;
    }
    # El procesamiento regular continúa aquí
}
  1. Modificar la respuesta basada en el valor del encabezado:
location / {
    proxy_pass http://backend;

    if ($sent_http_My_custom_header = "premium") {
        add_header X-User-Type "Premium";
    }
}
  1. Controlar el acceso basado en el valor del encabezado:
location /restricted {
    if ($sent_http_My_custom_header != "authorized") {
        return 403;
    }
    # El acceso autorizado continúa aquí
}

Estos ejemplos muestran cómo puede utilizar el valor del encabezado personalizado para controlar el comportamiento de su servidor Nginx, permitiendo configuraciones más complejas y dinámicas basadas en las respuestas del servidor upstream.