興味深いApache mod_rewrite設定を使用してリバースプロキシを変換して、代わりにNginxを使用しようとしています(外部の懸念により、ApacheからNginxに移行しているため、この部分を除いてほとんどすべてが正常に機能します)。
私の最初の設定は、HTTP Cookie(アプリケーションによって設定された)を読み取り、その値に応じて、リバースプロキシを異なるバックエンドに転送することでした。それはこのようなものでした:
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]
私はNginxを使用して同じことを達成しようとしています、そして私の初期設定はこのようなものでした( "proxy_override"は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;
}
しかし、そうではありませんでした。Nginxがプライマリプロキシを記述して何かにリダイレクトすることでCookieを読み取ることができるかどうかを確認しようとしましたが${cookie_proxy_override}
、コンテンツを正常に読み取ることがわかりますが、if
sは常に失敗するようです。
リキの答えによると、私の次の試みはこれでした:
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;
}
そして今、私はif
ブロックがアクティブになるのを見ることができますが、リクエストをプロキシするのではなく(私がそうするだろうと思ったように)、それは指定されたURLへの302リダイレクトを返します-これは私がやろうとしていることではありません:サーバーが必要です要求をバックエンドに透過的に中継し、応答を元のクライアントにパイプします。
何が悪いのですか?
if
)、それを実装したためです。ただし、1つの問題があります-Nginx(少なくとも私のバージョン:1.0.0)はでの番号付きキャプチャが好きではないmap
ため、~^(?P<name>[\w-]+) $name;
代わりに使用する必要がありました。私はそれに応じてあなたの答えを編集しました。