Bunun yerine Nginx kullanmak için ilginç bir Apache mod_rewrite kurulumu kullanarak ters proxy dönüştürmek çalışıyorum (dış endişeler nedeniyle biz Apache Nginx için hareket ediyor ve çoğu her şey bu bölüm dışında iyi çalışıyor).
Orijinal kurulumum bir HTTP çerezi okumak (bazı uygulamalar tarafından ayarlanmış) ve değerine bağlı olarak, ters proxy'yi farklı arka uçlara yönlendirmekti. Bunun gibi bir şey gitti:
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 kullanarak aynı elde etmeye çalışıyorum ve benim ilk yapılandırma böyle bir şey ("proxy_override" çerez adıdır):
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;
}
Ama olmadı. Nginx dayalı bir şeye yönlendirmek için birincil proxy yazarak çerezimi okuyabilir olup olmadığını görmek için çalıştım ${cookie_proxy_override}
ve içeriği iyi okuduğunu görebilirsiniz, ancak if
s her zaman başarısız gibi görünüyor.
Rikih'in cevabına göre bir sonraki denemem şuydu:
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;
}
Ve şimdi if
bloğun etkinleştirildiğini görebiliyorum, ancak isteği proxy yapmak yerine (yapacağını düşündüğüm gibi) belirtilen URL'ye 302 yönlendirmesi döndürüyor - yapmaya çalıştığım şey bu değil: Sunucuya ihtiyacım var isteği arka uçlara şeffaf bir şekilde aktarmak ve yanıtı orijinal istemciye iletmek için.
Neyi yanlış yapıyorum?
if
) ve uyguladım. Bir sorun olsa - Nginx (en azından benim sürüm: 1.0.0) numaralı yakalama sevmezmap
, bu yüzden~^(?P<name>[\w-]+) $name;
bunun yerine kullanmak zorunda kaldı . Cevabınızı buna göre düzenledim.