আমি পরিবর্তে এনগিনেক্স ব্যবহার করার জন্য একটি আকর্ষণীয় অ্যাপাচি মোড_উরাইট সেটআপ ব্যবহার করে একটি বিপরীত প্রক্সি রূপান্তরিত করার চেষ্টা করছি (বাহ্যিক উদ্বেগের কারণে আমরা অ্যাপাচি থেকে এনগিনেক্সে চলেছি এবং এই অংশটি বাদ দিয়ে বেশিরভাগ কিছুই সূক্ষ্মভাবে কাজ করে)।
আমার আসল সেটআপটি ছিল কোনও এইচটিটিপি কুকি (কিছু অ্যাপ্লিকেশন দ্বারা সেট করা) পড়ার এবং এর মানের উপর নির্ভর করে বিপরীত প্রক্সিটি বিভিন্ন ব্যাককেন্ডে সরাসরি পরিচালনা করা। এটি এরকম কিছু হয়েছিল:
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]
আমি এনগিনেক্স ব্যবহার করে এটি অর্জনের চেষ্টা করছি এবং আমার প্রাথমিক কনফিগারেশনটি ছিল এরকম কিছু (যেখানে "প্রক্সি_ওভারাইড" কুকির নাম):
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_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;
পরিবর্তে আমাকে ব্যবহার করতে হয়েছিল। আমি আপনার উত্তর অনুসারে সম্পাদনা করেছি।