मैं एक दिलचस्प अपाचे mod_rewrite सेटअप का उपयोग करके Nginx का उपयोग करने के बजाय एक रिवर्स प्रॉक्सी को बदलने की कोशिश कर रहा हूं (बाहरी चिंताओं के कारण हम Apache से Nginx में जा रहे हैं, और इस भाग को छोड़कर अधिकांश सब कुछ ठीक काम करता है)।
मेरा मूल सेटअप एक 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 का उपयोग करके समान हासिल करने की कोशिश कर रहा हूं, और मेरा प्रारंभिक कॉन्फ़िगरेशन कुछ इस तरह था (जहां "प्रॉक्सी_ओवराइड" कुकी का नाम है):
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;
}
लेकिन ऐसा नहीं हुआ। मैंने यह देखने की कोशिश की है कि क्या नग्नेक्स प्राथमिक आधार पर रीडायरेक्ट करने के लिए मेरे कुकी को पढ़ सकता है, जिसके आधार पर ${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
ब्लॉक सक्रिय हो गया है, लेकिन अनुरोध को अनुमानित करने के बजाय (जैसे मैंने सोचा था कि यह होगा) यह निर्दिष्ट URL पर 302 रीडायरेक्ट लौटाता है - जो मैं करने की कोशिश नहीं कर रहा हूं: मुझे सर्वर की आवश्यकता है पारदर्शी रूप से बैकएंड के लिए अनुरोध को रिले करें और मूल ग्राहक की प्रतिक्रिया को पाइप करें।
मैं क्या गलत कर रहा हूं?
if
) और मैंने इसे लागू किया। हालांकि एक समस्या है - नग्नेक्स (कम से कम मेरा संस्करण: 1.0.0) में गिने हुए कैप्चर पसंद नहीं हैmap
, इसलिए मुझे~^(?P<name>[\w-]+) $name;
इसके बजाय उपयोग करना था। मैंने उसी के अनुसार आपका उत्तर संपादित किया है।