Sto cercando di convertire un proxy inverso utilizzando un'interessante configurazione mod_rewrite di Apache per utilizzare Nginx (a causa di preoccupazioni esterne ci stiamo spostando da Apache a Nginx e quasi tutto funziona bene tranne questa parte).
La mia configurazione originale era quella di leggere un cookie HTTP (impostato da alcune applicazioni) e, a seconda del suo valore, indirizzare il proxy inverso a diversi backend. È andata più o meno così:
RewriteCond %{HTTP_COOKIE} proxy-target-A
RewriteRule ^/original-request/ http://backend-a/some-application [P,QSA]
RewriteCond %{HTTP_COOKIE} proxy-target-B
RewriteRule ^/original-request http://backend-b/another-application [P,QSA]
RewriteRule ^/original-request http://primary-backend/original-application [P,QSA]
Sto cercando di ottenere lo stesso utilizzando Nginx e la mia configurazione iniziale era qualcosa del genere (dove "proxy_override" è il nome del cookie):
location /original-request {
if ($cookie_proxy_override = "proxy-target-A") {
rewrite . http://backend-a/some-application;
break;
}
if ($cookie_proxy_override = "proxy-target-B") {
rewrite . http://backend-b/another-application;
break;
}
proxy_pass http://primary-backend/original-application;
}
Ma non lo fece. Ho provato a vedere se Nginx è in grado di leggere il mio cookie scrivendo il proxy principale per reindirizzare a qualcosa in base ${cookie_proxy_override}
e posso vedere che legge bene il contenuto, ma if
sembra che non riescano sempre.
Il mio prossimo tentativo, secondo la risposta di Rikih, è stato questo:
location /original-request {
if ($http_cookie ~ "proxy-target-A") {
rewrite . http://backend-a/some-application;
break;
}
if ($http_cookie ~ "proxy-target-B") {
rewrite . http://backend-b/another-application;
break;
}
proxy_pass http://primary-backend/original-application;
}
E ora posso vedere che il if
blocco viene attivato, ma invece di inoltrare la richiesta (come pensavo che avrebbe fatto) restituisce un reindirizzamento 302 all'URL specificato - che non è quello che sto cercando di fare: ho bisogno del server per inoltrare in modo trasparente la richiesta ai backend e inoltrare la risposta al client originale.
Che cosa sto facendo di sbagliato?
if
entrare) e l'ho implementata. C'è un problema però: a Nginx (almeno la mia versione 1.0.0) non piacciono le acquisizioni numeratemap
, quindi ho dovuto usare~^(?P<name>[\w-]+) $name;
invece. Ho modificato la tua risposta di conseguenza.