কুকি ব্যবহার করে এনগিনেক্স প্রক্সি লক্ষ্য নিয়ন্ত্রণ করছেন?


11

আমি পরিবর্তে এনগিনেক্স ব্যবহার করার জন্য একটি আকর্ষণীয় অ্যাপাচি মোড_উরাইট সেটআপ ব্যবহার করে একটি বিপরীত প্রক্সি রূপান্তরিত করার চেষ্টা করছি (বাহ্যিক উদ্বেগের কারণে আমরা অ্যাপাচি থেকে এনগিনেক্সে চলেছি এবং এই অংশটি বাদ দিয়ে বেশিরভাগ কিছুই সূক্ষ্মভাবে কাজ করে)।

আমার আসল সেটআপটি ছিল কোনও এইচটিটিপি কুকি (কিছু অ্যাপ্লিকেশন দ্বারা সেট করা) পড়ার এবং এর মানের উপর নির্ভর করে বিপরীত প্রক্সিটি বিভিন্ন ব্যাককেন্ডে সরাসরি পরিচালনা করা। এটি এরকম কিছু হয়েছিল:

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 পুনর্নির্দেশ ফিরিয়ে দেয় - যা আমি করার চেষ্টা করছি তা নয়: আমার সার্ভারের দরকার স্বচ্ছভাবে ব্যাককেন্ডগুলিতে অনুরোধটি রিলে করতে এবং মূল ক্লায়েন্টের প্রতিক্রিয়াটি পাইপ করতে।

আমি কি ভুল করছি?

উত্তর:


16

এই উত্তর অনুরূপ । এই ধরণের সমস্যায় Nginx এর অভিবাদনীয় পদ্ধতির মাধ্যমে map

মূলত, আপনি একটি সংজ্ঞায়িত mapমধ্যে httpঅধ্যায়

map $cookie_proxy_override $my_upstream {
  default default-server-or-upstream;
  ~^(?P<name>[\w-]+) $name;
}

তারপর আপনি কেবল ব্যবহার $my_upstreamমধ্যে locationঅধ্যায় (গুলি):

location /original-request {
  proxy_pass http://$my_upstream$uri;
}

Nginx কেবলমাত্র একবার (অনুরোধ অনুযায়ী) এবং যখন আপনি সেগুলি ব্যবহার করছেন তখন অলসভাবে মানচিত্রের ভেরিয়েবলগুলি মূল্যায়ন করে।


3
ধন্যবাদ, এটি আমার পক্ষে আরও ভাল পদ্ধতির, বিশেষত কারণ আমি নামকৃত কুকি ভেরিয়েবলটি সরাসরি ব্যবহার করতে পারি (কেন আমি পারছি না তা নিশ্চিত নয় if) এবং আমি এটি বাস্তবায়ন করেছি। যদিও এখানে একটি সমস্যা রয়েছে - এনগিনেক্স (কমপক্ষে আমার সংস্করণ: 1.0.0) নম্বরযুক্ত ক্যাপচারগুলি পছন্দ করে না map, সুতরাং এর ~^(?P<name>[\w-]+) $name;পরিবর্তে আমাকে ব্যবহার করতে হয়েছিল। আমি আপনার উত্তর অনুসারে সম্পাদনা করেছি।
গাস

3

অবশেষে আমার সমাধানটি এতে ফোটে:

server {
    ...
    set $upstream "default-server-or-upstream";
    if ($http_cookie ~ "proxy_override=([\w-]+)") {
        set $upstream $1;                                   
    }

    location /original-request {
        proxy_pass http://$upstream/original-application
    }
}

পরীক্ষা serverপ্রতিটি অনুরোধের সুযোগে করা হয় (প্রকৃত পুনঃনির্দেশটি সমাধানের আগে) এবং কেবলমাত্র একটি ভেরিয়েবল সেট করতে ব্যবহৃত হয় - এটি সম্ভবত Nginx "পুনর্লিখন" মডিউলটির সমর্থিত ব্যবহার। এটি $http_cookieরিকিহর পরামর্শ মতো পুরোটাও পরীক্ষা করে , তবে কুকির নাম অন্তর্ভুক্ত করে এটি নিশ্চিত করতে যে আমি এলোমেলো জিনিসগুলি লোকেরা আমার দিকে ছুড়ে ফেলতে পারে তা মেলে না।

তারপরে locationযেখানে আমি পুনঃনির্দেশটি করতে চাই সেই সুযোগে আমি চলক নামটি ব্যবহার করি যা হয় পূর্বনির্ধারিত আপস্ট্রিম কনফিগারেশন ধারণ করে বা কুকি দ্বারা ওভাররাইট করা হয়েছিল।


0

আপনি কি $ http_cookie চেষ্টা করেছেন? http://wiki.nginx.org/HttpRewriteModule

যদি ($ http_cookie ~ * "প্রক্সি-টার্গেট-এ") {ফু; }


এটি প্রকৃতপক্ষে পরীক্ষার জন্য কাজ করেছে, যদিও আমি নিশ্চিত না কেন আমি কেবল নির্দিষ্ট কুকির নামের বিরুদ্ধে কেন পরীক্ষা করতে পারি না। আমি যা পছন্দ করি না তা হ'ল rewriteপ্রক্সি পুনর্লিখনটি আসলে না করে পরিবর্তে ক্লায়েন্টকে পুনর্নির্দেশ প্রদান করে এবং আমি ব্লকটিতে প্রক্সি_পাস ব্যবহার করতে পারি না if। আমি সেই অনুযায়ী প্রশ্ন আপডেট করেছি।
12:58

0

আমার নমুনা রয়েছে যা আমি ইউডিডের উপর ভিত্তি করে অনুরোধ শিরোনাম সনাক্ত করতে ব্যবহার করি এবং এটি কাজ করছে, সম্ভবত আপনি কিছু ধারণা পাবেন।

   location / {
      proxy_set_header Host $http_host;
  if ($request_uri ~ ^/(.*)udid=xxxxxxxxxxxxxx(.*)$) {
    proxy_pass   http://1.1.1.1$request_uri;
    break;
  }
  if ($request_uri ~ ^/(.*)udid=yyyyyyyyyyyyyy(.*)$) {
    proxy_pass   http://3.3.3.3$request_uri;
    break;
  }
       proxy_pass http://2.2.2.2$request_uri;
    }

আপনি Nginx এর কোন সংস্করণ ব্যবহার করছেন? আমি 1.0 ব্যবহার করছি এবং যখন আমি proxy_pass ব্যবহার হচ্ছে আপনি এখানে নিদিষ্ট, আমি এই ত্রুটি বার্তা পাবেন:nginx: [emerg] "proxy_pass" may not have URI part in location given by regular expression, or inside named location, or inside the "if" statement, or inside the "limit_except" block in /etc/nginx/conf.d/proxy.conf:47
গাস

আমি nginx-0.8.53-1.el5

আপনি কি একবার নজর দিতে
চোক্রিপাল

ফোরামের সমাধানটি হ'ল অন্য সার্ভারে প্রক্সিং করার সময় অনুরোধটি ইউআরআই পরিবর্তন করা উচিত নয়, তবে আমার ঠিক এটিই করা দরকার - অনুরোধটি ইউআরআই পুনর্লিখন করে কোনও অ্যাপ্লিকেশনকে আলাদা করতে লক্ষ্য করতে হবে তবে মূল URL এর অন্তর্ভুক্ত what এছাড়াও, আপনার উদাহরণটি অনুরোধে ইউআরআই অনুরোধটি কমান্ডেও ব্যবহার করেছে বলে মনে হয় proxy_pass, সুতরাং উপরের ফোরামের আলোচনার ভিত্তিতে আপনি কীভাবে এটি কাজ করতে পারবেন তা আমি নিশ্চিত নই।
Gus
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.