Estoy tratando de convertir un proxy inverso usando una configuración interesante de Apache mod_rewrite para usar Nginx en su lugar (debido a preocupaciones externas, nos estamos moviendo de Apache a Nginx, y casi todo funciona bien, excepto esta parte).
Mi configuración original era leer una cookie HTTP (establecida por alguna aplicación) y, dependiendo de su valor, dirigir el proxy inverso a diferentes backends. Fue algo como ésto:
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]
Estoy tratando de lograr lo mismo usando Nginx, y mi configuración inicial fue algo así (donde "proxy_override" es el nombre de la 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;
}
Pero no fue así. Traté de ver si Nginx puede leer mi cookie escribiendo el proxy primario para redirigir a algo basado ${cookie_proxy_override}
y puedo ver que lee bien el contenido, pero if
parece que los s siempre fallan.
Mi siguiente intento, de acuerdo con la respuesta de Rikih fue este:
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;
}
Y ahora puedo ver que el if
bloque se activa, pero en lugar de enviar la solicitud (como pensé que haría), devuelve una redirección 302 a la URL especificada, que no es lo que estoy tratando de hacer: necesito el servidor para retransmitir de forma transparente la solicitud a los servidores y canalizar la respuesta al cliente original.
¿Qué estoy haciendo mal?
if
entrar) y la implementé. Sin embargo, hay un problema: a Nginx (al menos mi versión: 1.0.0) no le gustan las capturas numeradasmap
, así que tuve que usarlas~^(?P<name>[\w-]+) $name;
. He editado tu respuesta en consecuencia.