J'essaie de convertir un proxy inverse en utilisant une configuration Apache mod_rewrite intéressante pour utiliser Nginx à la place (en raison de problèmes externes, nous passons d'Apache à Nginx, et la plupart des choses fonctionnent bien sauf cette partie).
Ma configuration d'origine était de lire un cookie HTTP (défini par une application) et, en fonction de sa valeur, de diriger le proxy inverse vers différents backends. Il est allé quelque chose comme ça:
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]
J'essaie d'obtenir la même chose en utilisant Nginx, et ma configuration initiale était quelque chose comme ça (où "proxy_override" est le nom du 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;
}
Mais ce n'était pas le cas. J'ai essayé de voir si Nginx peut lire mon cookie en écrivant le proxy principal pour rediriger vers quelque chose basé sur ${cookie_proxy_override}
et je peux voir qu'il lit bien le contenu, mais les if
s semblent toujours échouer.
Mon prochain essai, selon la réponse de Rikih, était le suivant:
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;
}
Et maintenant, je peux voir que le if
bloc est activé, mais au lieu de mandater la demande (comme je le pensais), il renvoie une redirection 302 vers l'URL spécifiée - ce qui n'est pas ce que j'essaie de faire: j'ai besoin du serveur pour relayer de manière transparente la demande aux backends et diriger la réponse vers le client d'origine.
Qu'est-ce que je fais mal?
if
) et je l'ai implémentée. Il y a un problème cependant - Nginx (au moins ma version: 1.0.0) n'aime pas les captures numérotéesmap
, j'ai donc dû utiliser à la~^(?P<name>[\w-]+) $name;
place. J'ai modifié votre réponse en conséquence.