Я намагаюся перетворити зворотний проксі, використовуючи цікавий параметр mod_rewrite Apache, щоб використовувати замість нього Nginx (через зовнішні проблеми ми переходимо від Apache до Nginx, і більшість все працює нормально, крім цієї частини).
Моя оригінальна настройка полягала в тому, щоб прочитати файл cookie HTTP (встановлений якоюсь програмою) і, залежно від його значення, направити зворотний проксі-сервер на різні програми. Вийшло приблизно так:
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
, здається, завжди не виходить .
Наступна моя спроба, згідно з відповіддю Рікіка, була така:
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
блок активується, але замість того, щоб звертатися до запиту (як я думав, що це зробить), він повертає переспрямування 302 на вказану URL - що не те, що я намагаюся зробити: мені потрібен сервер прозоро ретранслювати запит на вихідні дані та передавати відповідь вихідному клієнту.
Що я роблю неправильно?
if
) і я її реалізував. Однак є одна проблема - Nginx (принаймні моя версія: 1.0.0) не любить нумеровані захопленняmap
, тому мені довелося використовувати~^(?P<name>[\w-]+) $name;
замість цього. Я відповідно відредагував вашу відповідь.