Estou tentando converter um proxy reverso usando uma configuração interessante do mod_rewrite do Apache para usar o Nginx (devido a preocupações externas que estamos passando do Apache para o Nginx, e a maioria das coisas funciona bem, exceto essa parte).
Minha configuração original era ler um cookie HTTP (definido por algum aplicativo) e, dependendo do seu valor, direcionar o proxy reverso para diferentes backends. Foi algo assim:
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]
Estou tentando conseguir o mesmo usando o Nginx, e minha configuração inicial era algo assim (onde "proxy_override" é o nome do 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;
}
Mas isso não aconteceu. Eu tentei ver se o Nginx pode ler meu cookie escrevendo o proxy principal para redirecionar para algo baseado em ${cookie_proxy_override}
e posso ver que ele lê o conteúdo, mas o if
s parece sempre falhar.
Minha próxima tentativa, de acordo com a resposta de Rikih, foi esta:
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 agora eu posso ver que o bloco if
é ativado, mas em vez de fazer proxy na solicitação (como achei que faria) ele retorna um redirecionado 302 para a URL especificada - o que não é o que estou tentando Eu preciso que o servidor transmita a solicitação de forma transparente para os backends e canalize a resposta para o cliente original.
O que estou fazendo de errado?