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:
- Apri il file di configurazione di Nginx.
- Aggiungi o modifica il blocco location:
location /service/ {
proxy_pass http://apache/;
}
- La barra finale in
proxy_pass http://apache/;dice a Nginx di sostituire/service/con/quando passa la richiesta. - 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¶m2=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:
- Apri il file di configurazione di Nginx.
- Aggiungi o modifica il blocco location usando una regex:
location ~* ^/service/(.*) {
proxy_pass http://apache/$1$is_args$args;
}
- Il
~*indica una corrispondenza con espressione regolare non sensibile alle maiuscole. ^/service/(.*)cattura tutto ciò che segue/service/nell'URL.$1in proxy_pass si riferisce al gruppo catturato.$is_args$argsaggiunge 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:
-
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.
-
Abilita proxy_buffering:
proxy_buffering on;Questo permette a Nginx di bufferizzare le risposte dal server backend, migliorando le prestazioni.
-
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:
-
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.
-
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.
-
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.





