उपयोगकर्ता एजेंट के आधार पर Nginx पुनर्निर्देशित


15

यहाँ मेरा वर्तमान nginx conf है:

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: दो सर्वर ब्लॉक, domain.com और domain2.com के लिए एक-एक करें।

चरण 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;
  }
}

एनबी आपको काम करने के लिए मानचित्र में संक्षिप्त स्ट्रिंग के लिए nginx 0.9.0 या उच्चतर की आवश्यकता होगी।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.