¿Cómo reenviar parámetros de Query String a través de proxy_pass de Nginx?

Publicado 13 de octubre de 2024

Problema: Reenvío de parámetros de cadena de consulta en Nginx

Al usar Nginx como proxy inverso, pasar los parámetros de cadena de consulta de la solicitud original al servidor backend puede ser complicado. Este problema suele ocurrir al configurar la directiva proxy_pass, ya que el comportamiento predeterminado puede no siempre mantener estos parámetros.

Implementación del reenvío de cadenas de consulta en proxy_pass de Nginx

Método 1: Uso de un bloque de ubicación simple

El enfoque del bloque de ubicación ofrece una forma de reenviar parámetros de cadena de consulta en Nginx. Este método utiliza una directiva de ubicación con una barra diagonal al final en la declaración proxy_pass.

Pasos de configuración:

  1. Abra su archivo de configuración de Nginx.
  2. Añada o modifique el bloque de ubicación:
location /service/ {
    proxy_pass http://apache/;
}
  1. La barra diagonal al final en proxy_pass http://apache/; indica a Nginx que reemplace /service/ por / al pasar la solicitud.
  2. Esta configuración reenvía los parámetros de cadena de consulta sin modificaciones adicionales.

Consejo: Prueba del reenvío de cadenas de consulta

Para probar si el reenvío de cadenas de consulta funciona correctamente, puede usar una herramienta como curl o las herramientas de desarrollador de su navegador. Intente acceder a una URL con parámetros de consulta, como: http://su-dominio.com/service/page?param1=valor1&param2=valor2. Verifique si estos parámetros se reenvían correctamente a su servidor backend.

Método 2: Uso de expresiones regulares con parámetros de consulta

Para escenarios complejos, el uso de expresiones regulares con parámetros de consulta proporciona más flexibilidad.

Pasos de configuración:

  1. Abra su archivo de configuración de Nginx.
  2. Añada o modifique el bloque de ubicación usando una expresión regular:
location ~* ^/service/(.*) {
    proxy_pass http://apache/$1$is_args$args;
}
  1. El ~* indica una coincidencia de expresión regular sin distinción entre mayúsculas y minúsculas.
  2. ^/service/(.*) captura todo lo que sigue a /service/ en la URL.
  3. $1 en el proxy_pass se refiere al grupo capturado.
  4. $is_args$args añade la cadena de consulta a la URL proxy.

Este método permite un mayor control sobre la reescritura de URL mientras mantiene los parámetros de cadena de consulta.

Consideraciones adicionales para la configuración de proxy_pass en Nginx

Preservación de la información de solicitud original

Al usar proxy_pass, es importante mantener intacta la solicitud original. Aquí hay algunas formas de hacerlo:

  1. Use directivas proxy_set_header:

    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    Estos encabezados envían la información del cliente original al servidor backend.

  2. Active proxy_buffering:

    proxy_buffering on;

    Esto permite a Nginx almacenar en búfer las respuestas del servidor backend, mejorando el rendimiento.

  3. Establezca tiempos de espera:

    proxy_connect_timeout 60s;
    proxy_send_timeout 60s;
    proxy_read_timeout 60s;

    Estas configuraciones gestionan los tiempos de conexión entre Nginx y el servidor backend.

Consejo: Preservar la ruta de URL

Para mantener la ruta de URL original al proxy de solicitudes, use la variable $request_uri:

location /api/ {
    proxy_pass http://backend$request_uri;
}

Esto asegura que la ruta completa después de /api/ se envíe al servidor backend.

Manejo de SSL/TLS en configuraciones de proxy

Para configuraciones seguras de proxy_pass, considere estas prácticas:

  1. Use SSL/TLS para conexiones backend:

    server {
    listen 443 ssl;
    server_name example.com;
    
    ssl_certificate /ruta/al/certificado.pem;
    ssl_certificate_key /ruta/a/la/clave.pem;
    
    location / {
        proxy_pass https://backend;
        proxy_ssl_verify on;
        proxy_ssl_trusted_certificate /ruta/al/certificado_ca_confiable.pem;
    }
    }

    Esta configuración usa HTTPS para la conexión proxy_pass y verifica el certificado del servidor backend.

  2. Establezca protocolos y cifrados SSL:

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    Estas configuraciones limitan los protocolos SSL/TLS y cifrados a opciones seguras.

  3. Active HSTS (HTTP Strict Transport Security):

    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

    Este encabezado indica a los navegadores que siempre usen HTTPS para su dominio.