ব্যবহারকারী এজেন্টের উপর ভিত্তি করে Nginx পুনর্নির্দেশ


15

এখানে আমার বর্তমান এনগিনেক্স কনফ:

server {
  listen 90;
  server_name www.domain.com www.domain2.com;
  root /root/app;
  location / {
    try_files $uri =404;
  }
  location ~ /([-\w]+)/(\w+)/ {
    proxy_pass bla bla
  }
}

এটা কাজ করে জরিমানা, উভয় www.domain.comএবং www.domain2.comএকই বিষয়বস্তু পরিবেশন করা।

এখন আমি যুক্ত করতে চাই

যদি ব্যবহারকারী www.domain.com দেখছেন এবং ব্যবহারকারী এজেন্টটি xxx হয় তবে www.domain2.com এ পুনঃনির্দেশ করুন

আমি অনেক পদ্ধতি অনুসন্ধান করেছি এবং চেষ্টা করেছি কিন্তু সেগুলির কোনওটিই কাজ করে না।


পুনর্নির্দেশের পরেও আপনি কি একই বিষয়বস্তুটি পরিবেশন করতে চান?
পোথি কলিমুথু

@ পোথি হ্যাঁ, ঠিক
wong2

ঠিক আছে. আমার উত্তর পরীক্ষা করুন।
পোথি কলিমুথু

উত্তর:


12

এই সমস্যাটি ঠিক করার দুটি উপায় রয়েছে।

  1. Www.domain.com এবং www.domain2.com এর জন্য দুটি পৃথক "সার্ভার" ব্লক রয়েছে এবং "সার্ভার" ব্লক www.domain.com- এ নিম্নলিখিত বিধিগুলির লাইন যুক্ত করুন। এই সমস্যাটি সমাধান করার জন্য এটি প্রস্তাবিত উপায়।

    if ($http_user_agent ~* "^xxx$") {
       rewrite ^/(.*)$ http://www.domain2.com/$1 permanent;
    }
    
  2. আপনি যদি উভয় ডোমেনের জন্য একটি একক "সার্ভার" ব্লক দিয়ে পুনঃনির্দেশ পরিচালনা করতে চান, নীচের নীচে চেষ্টা করুন

    set $check 0;
    if ($http_user_agent ~* "^xxx$") {
        set $check 1;
    }
    if ($host ~* ^www.domain.com$) {
        set $check "${check}1";
    }
    if ($check = 11) {
        rewrite ^/(.*)$ http://www.domain2.com/$1 permanent;
    }
    

Nginx.com/resources/wiki/start/topics/depth/ifisevil থেকে সরাসরি উক্তি ... "কোনও অবস্থানের প্রসঙ্গে যদি কেবলমাত্র 100% সুরক্ষিত জিনিসগুলি ভিতরে করা যায় তবে তা হ'ল : ফিরে আসুন এবং পুনরায় লিখুন"।
পোথি কলিমুথু

6

পদক্ষেপ 1: দুটি সার্ভার ব্লক, ডোমেন ডটকম এবং ডোমেন 2 ডট কমের জন্য একটি করে রয়েছে।

পদক্ষেপ 2: যদি ভুলভাবে ব্যবহার করা হয় তবে এটি যদি মন্দ হয় তবে সঠিকভাবে ব্যবহার করুন।

এখানে সম্পূর্ণ সমাধান ...

server {
  listen 90;
  server_name www.domain.com;
  root /root/app;

  # redirect if 'xxx' is found on the user-agent string
  if ( $http_user_agent ~ 'xxx' ) {
    return 301 http://www.domain2.com$request_uri;
  }

  location / {
    try_files $uri =404;
  }
  location ~ /([-\w]+)/(\w+)/ {
    proxy_pass bla bla
  }
}

server {
  listen 90;
  server_name www.domain2.com;
  root /root/app;
  location / {
    try_files $uri =404;
  }
  location ~ /([-\w]+)/(\w+)/ {
    proxy_pass bla bla
  }
}

301 এর পরিবর্তে, আপনি আপনার ব্যবহারের ক্ষেত্রে উপর নির্ভর করে 302 টিও ব্যবহার করতে পারেন।
পোথি কলিমুথু

হুম, আমি মনে করি এই সমাধানটিতে অনেকগুলি নকল কোড রয়েছে
wong2

কোনও সমস্যা সমাধানের একাধিক উপায় রয়েছে। আমি কীভাবে এটির সমাধান হতে পারে তার পিছনে যুক্তি দেখানোর জন্য আমার সমাধান পোস্ট করেছি। সদৃশগুলি এড়ানোর একাধিক উপায় রয়েছে।
পোথি কলিমুথু

4

প্রস্তাবিত উপায় সম্ভবত একটি ব্যবহার করা হবে map, কারণ এই ভেরিয়েবলগুলি কেবল তখনই ব্যবহৃত হয় যখন তাদের ব্যবহার করা হয়।

পুনরায় return 301 ...লেখাগুলির চেয়েও ব্যবহারকে প্রাধান্য দেওয়া হয়, কারণ কোনও নিয়মিত অভিব্যক্তি সংকলন করতে হয় না।

সংযোগযুক্ত স্ট্রিং হিসাবে হোস্ট এবং ব্যবহারকারী-এজেন্টের একটি উদাহরণ যেখানে একটি একক রেজেক্সের সাথে তুলনা করা হয়েছে:

map "$host:$http_user_agent" $my_domain_map_host {
  default                      0;
  "~*^www.domain.com:Agent.*$" 1;
}

server {
  if ($my_domain_map_host) {
    return 302 http://www.domain2.com$request_uri;
  }
}

এবং এটি আরও বেশি নমনীয় হতে পারে, উদাহরণস্বরূপ যদি সেখানে 2 না হয় তবে আরও বেশি ডোমেন জড়িত থাকে।

এখানে আমরা মানচিত্র www.domain.comদিয়ে শুরু ব্যবহারকারী-এজেন্টদের সঙ্গে Agentথেকে http://www.domain2.comএবং www.domain2.comসঠিক ব্যবহারকারী-এজেন্ট সঙ্গে Other Agentথেকে http://www.domain3.com:

map "$host:$http_user_agent" $my_domain_map_host {
  default                             0;
  "~*^www.domain.com:Agent.*$"        http://www.domain2.com;
  "~*^www.domain2.com:Other Agent$"   http://www.domain3.com;
}

server {
  if ($my_domain_map_host) {
    return 302 $my_domain_map_host$request_uri;
  }
}

NB আপনার কাজের জন্য মানচিত্রের স্ট্রিংয়ের জন্য এনগিনেক্স ০.৯.০ বা তার বেশি প্রয়োজন higher

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.