¿Cómo añadir un header de respuesta personalizado en Nginx con proxy_pass?

Publicado 17 de octubre de 2024

Problema: Añadir Encabezados de Respuesta Personalizados con Nginx y Proxy_Pass

Añadir encabezados de respuesta personalizados en Nginx cuando se usa proxy_pass puede ser complicado. Esta configuración a menudo es necesaria para añadir información específica o modificar la respuesta de un servidor upstream antes de que llegue al cliente.

Usar add_header con Proxy_Pass

Configurar Nginx para Encabezados Personalizados

La directiva add_header en Nginx funciona con proxy_pass, permitiéndote añadir encabezados personalizados a las respuestas de los servidores upstream. Esta función es útil para añadir información extra o modificar la respuesta antes de que llegue al cliente.

Para usar add_header con proxy_pass, inclúyelo en el mismo bloque location que tu directiva proxy_pass. Aquí tienes un ejemplo de configuración de Nginx:

server {
    server_name example.com;

    location / {
        proxy_pass http://backend_server;
        add_header X-Custom-Header "Valor Personalizado";
    }
}

En esta configuración, Nginx añadirá el X-Custom-Header con el valor "Valor Personalizado" a todas las respuestas del backend_server. Este encabezado estará en la respuesta enviada al cliente, ya sea que Nginx o el servidor upstream haya generado la respuesta.

La directiva add_header se aplica al nivel actual y a todos los niveles inferiores a menos que se sobrescriba. Si quieres añadir encabezados solo para ubicaciones específicas, coloca la directiva add_header en el bloque location correspondiente.

Consejo: Encabezados Condicionales

Puedes usar variables de Nginx para añadir encabezados condicionalmente. Por ejemplo:

location / {
    proxy_pass http://backend_server;
    add_header X-Response-Time $request_time;
    add_header X-Cache-Status $upstream_cache_status;
}

Esta configuración añade el tiempo de respuesta y el estado de caché como encabezados personalizados, proporcionando información útil para la depuración.

Implementar la Solución

Guía Paso a Paso

Para añadir encabezados personalizados cuando se usa proxy_pass en Nginx, sigue estos pasos:

  1. Edita el archivo de configuración de Nginx: Abre tu archivo de configuración de Nginx con un editor de texto. El archivo suele estar en /etc/nginx/nginx.conf o /usr/local/nginx/conf/nginx.conf.

  2. Añade la directiva add_header: En el bloque server o location, añade la directiva add_header. Colócala después de la directiva proxy_pass para aplicarla a las respuestas proxy.

  3. Establece el encabezado personalizado y su valor: Define el nombre y valor de tu encabezado personalizado usando la directiva add_header. La sintaxis es:

    add_header <nombre_encabezado> <valor_encabezado>;

Aquí tienes un ejemplo de cómo podría verse tu configuración:

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend_server;
        add_header X-Custom-Header "Valor Personalizado";
        add_header X-Served-By $hostname;
    }
}

En este ejemplo, se añaden dos encabezados personalizados:

  • X-Custom-Header con un valor estático "Valor Personalizado"
  • X-Served-By con el valor de la variable $hostname, que contiene el nombre del servidor Nginx

Después de hacer estos cambios, guarda el archivo de configuración y recarga Nginx para aplicar la nueva configuración:

sudo nginx -t
sudo nginx -s reload

El primer comando verifica la configuración en busca de errores de sintaxis, mientras que el segundo recarga Nginx con la nueva configuración.

Consejo: Usar Variables en Encabezados Personalizados

Puedes usar variables de Nginx en tus encabezados personalizados para añadir información dinámica. Por ejemplo:

add_header X-Request-ID $request_id;
add_header X-Client-IP $remote_addr;

Estos encabezados incluirán el ID único de la solicitud y la dirección IP del cliente, respectivamente.

Opciones de Configuración Avanzadas

Usar el Parámetro 'always'

El parámetro 'always' en la directiva add_header de Nginx te permite añadir encabezados personalizados a todas las respuestas, incluyendo las respuestas de error. Esta función es útil cuando quieres que tus encabezados personalizados estén en cada respuesta, independientemente del código de estado.

Por defecto, Nginx añade encabezados personalizados solo a las respuestas exitosas (códigos de estado 2xx y 3xx). Para incluir encabezados personalizados en las respuestas de error (códigos de estado 4xx y 5xx), usa el parámetro 'always'.

Así es como se usa el parámetro 'always':

location / {
    proxy_pass http://backend_server;
    add_header X-Custom-Header "Valor Personalizado" always;
}

En esta configuración, el X-Custom-Header se añadirá a todas las respuestas, incluyendo las respuestas de error.

Puedes usar el parámetro 'always' con múltiples encabezados:

location / {
    proxy_pass http://backend_server;
    add_header X-Custom-Header1 "Valor1" always;
    add_header X-Custom-Header2 "Valor2" always;
    add_header X-Server-Name $hostname always;
}

Esta configuración añade tres encabezados personalizados a todas las respuestas, incluyendo aquellas con códigos de estado de error.

Consejo: Encabezados Condicionales con 'always'

Puedes combinar el parámetro 'always' con declaraciones condicionales para un mayor control:

location / {
    proxy_pass http://backend_server;
    add_header X-Cache-Status $upstream_cache_status always;
    if ($status = 404) {
        add_header X-Error-Type "No Encontrado" always;
    }
}

Esta configuración añade el encabezado X-Cache-Status a todas las respuestas y un encabezado X-Error-Type solo para errores 404.

Ejemplo: Usar 'always' para Encabezados de Seguridad

Para mejorar la seguridad, puedes usar el parámetro 'always' para añadir encabezados de seguridad importantes a todas las respuestas:

server {
    listen 80;
    server_name example.com;

    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-XSS-Protection "1; mode=block" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header Referrer-Policy "strict-origin-when-cross-origin" always;
    add_header Content-Security-Policy "default-src 'self';" always;

    location / {
        proxy_pass http://backend_server;
    }
}

Este ejemplo añade varios encabezados de seguridad a todas las respuestas, ayudando a proteger contra vulnerabilidades web comunes.

Recuerda que usar el parámetro 'always' puede mostrar información sensible en las respuestas de error. Revisa tus encabezados personalizados para evitar filtrar cualquier dato sensible.