Come inoltrare i parametri Query String attraverso Nginx proxy_pass?

Pubblicato 13 ottobre 2024

Problema: Inoltro dei Parametri della Stringa di Query in Nginx

Quando si usa Nginx come proxy inverso, passare i parametri della stringa di query dalla richiesta originale al server backend può essere complicato. Questo problema spesso si verifica quando si configura la direttiva proxy_pass, poiché il comportamento predefinito potrebbe non sempre mantenere questi parametri.

Implementazione dell'Inoltro della Stringa di Query in Nginx Proxy_Pass

Metodo 1: Utilizzo di un Semplice Blocco Location

L'approccio con il blocco location offre un modo per inoltrare i parametri della stringa di query in Nginx. Questo metodo utilizza una direttiva location con una barra finale nella dichiarazione proxy_pass.

Passaggi di configurazione:

  1. Apri il file di configurazione di Nginx.
  2. Aggiungi o modifica il blocco location:
location /service/ {
    proxy_pass http://apache/;
}
  1. La barra finale in proxy_pass http://apache/; dice a Nginx di sostituire /service/ con / quando passa la richiesta.
  2. Questa configurazione inoltra i parametri della stringa di query senza modifiche extra.

Suggerimento: Test dell'Inoltro della Stringa di Query

Per verificare se l'inoltro della stringa di query funziona correttamente, puoi usare uno strumento come curl o gli strumenti per sviluppatori del tuo browser. Prova ad accedere a un URL con parametri di query, come: http://tuo-dominio.com/service/pagina?param1=valore1&param2=valore2. Controlla se questi parametri vengono correttamente inoltrati al tuo server backend.

Metodo 2: Utilizzo di Espressioni Regolari con Parametri di Query

Per scenari più complessi, l'uso di espressioni regolari con parametri di query offre maggiore flessibilità.

Passaggi di configurazione:

  1. Apri il file di configurazione di Nginx.
  2. Aggiungi o modifica il blocco location usando una regex:
location ~* ^/service/(.*) {
    proxy_pass http://apache/$1$is_args$args;
}
  1. Il ~* indica una corrispondenza con espressione regolare non sensibile alle maiuscole.
  2. ^/service/(.*) cattura tutto ciò che segue /service/ nell'URL.
  3. $1 in proxy_pass si riferisce al gruppo catturato.
  4. $is_args$args aggiunge la stringa di query all'URL proxy.

Questo metodo permette un maggiore controllo sulla riscrittura dell'URL mantenendo i parametri della stringa di query.

Considerazioni Aggiuntive per la Configurazione di Nginx Proxy_Pass

Preservare le Informazioni della Richiesta Originale

Quando si usa proxy_pass, è importante mantenere intatta la richiesta originale. Ecco alcuni modi per farlo:

  1. Usa le direttive 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;

    Questi header inviano le informazioni del client originale al server backend.

  2. Abilita proxy_buffering:

    proxy_buffering on;

    Questo permette a Nginx di bufferizzare le risposte dal server backend, migliorando le prestazioni.

  3. Imposta i timeout:

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

    Queste impostazioni gestiscono i tempi di connessione tra Nginx e il server backend.

Suggerimento: Preservare il Percorso URL

Per mantenere il percorso URL originale durante il proxy delle richieste, usa la variabile $request_uri:

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

Questo assicura che il percorso completo dopo /api/ venga inviato al server backend.

Gestione SSL/TLS nelle Configurazioni Proxy

Per configurazioni proxy_pass sicure, considera queste pratiche:

  1. Usa SSL/TLS per le connessioni backend:

    server {
    listen 443 ssl;
    server_name example.com;
    
    ssl_certificate /percorso/del/cert.pem;
    ssl_certificate_key /percorso/della/key.pem;
    
    location / {
        proxy_pass https://backend;
        proxy_ssl_verify on;
        proxy_ssl_trusted_certificate /percorso/del/trusted_ca_cert.pem;
    }
    }

    Questa configurazione usa HTTPS per la connessione proxy_pass e verifica il certificato del server backend.

  2. Imposta protocolli e cifrari SSL:

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

    Queste impostazioni limitano i protocolli SSL/TLS e i cifrari a opzioni sicure.

  3. Abilita HSTS (HTTP Strict Transport Security):

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

    Questo header dice ai browser di usare sempre HTTPS per il tuo dominio.