Kullanıcı aracısına dayalı Nginx yönlendirmesi


15

İşte benim mevcut 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
  }
}

o cezayı çalışır hem www.domain.comve www.domain2.comaynı içeriği sunar.

şimdi eklemek istiyorum

kullanıcı www.etkialani.com adresini ziyaret ediyorsa ve kullanıcı aracısı xxx ise, www.alanmain2.com adresine yönlendirin

Birçok yöntem araştırdım ve denedim ama hiçbiri çalışmıyor.


Yönlendirmeden sonra bile aynı içeriği sunmak istiyor musunuz?
Pothi Kalimuthu

@Pothi evet, aynen
wong2

Tamam. Lütfen cevabımı kontrol et.
Pothi Kalimuthu

Yanıtlar:


12

Bu sorunu düzeltmenin iki yolu vardır.

  1. Www.domain.com ve www.domain2.com için iki ayrı "sunucu" bloğunuz olsun ve www.domain.com bloğundaki "sunucu" bloğuna aşağıdaki kural satırlarını ekleyin. Bu sorunu çözmenin önerilen yolu budur.

    if ($http_user_agent ~* "^xxx$") {
       rewrite ^/(.*)$ http://www.domain2.com/$1 permanent;
    }
    
  2. Yönlendirmeyi her iki alan için tek bir "sunucu" bloğu ile yönetmek istiyorsanız, aşağıdaki kuralları deneyin

    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 adresinden doğrudan alıntı ... "Bir konum bağlamında içeride yapılabilecek sadece% 100 güvenli şeyler: iade ve yeniden yazma".
Pothi Kalimuthu

6

Adım 1: Her biri domain.com ve domain2.com için olmak üzere iki sunucu bloğuna sahip olun.

Adım 2: Yanlış kullanılırsa kötüyse doğru kullanın .

İşte tam çözüm ...

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 yerine, kullanım durumunuza bağlı olarak 302 kullanabilirsiniz.
Pothi Kalimuthu

hmm, bence bu çözüm çok fazla yinelenen kod içeriyor
wong2

Bir sorunu çözmenin birden fazla yolu vardır. Çözümümü yalnızca, nasıl çözülebileceğinin ardındaki mantığı görmenizi sağlamak için yayınladım. Yinelemeleri önlemenin birden çok yolu vardır.
Pothi Kalimuthu

4

mapBu değişkenler yalnızca kullanıldıklarında değerlendirildiklerinden, önerilen yol muhtemelen a'yı kullanır .

Ayrıca, return 301 ...yeniden yazmalara göre kullanımı tercih edilir, çünkü düzenli bir ifadenin derlenmesi gerekmez.

Burada, birleştirilmiş dize olarak ana bilgisayar ve kullanıcı aracısının tek bir normal ifadeyle karşılaştırıldığı bir örnek:

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;
  }
}

Ve bu daha da esnek olabilir, örneğin, 2 değil, daha fazla alan söz konusuysa.

Burada map www.domain.comkullanıcı aracısı ile başlayan Agentetmek http://www.domain2.comve www.domain2.comkesin user-agent ile Other Agentkarşı 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;
  }
}

Not : Haritadaki birleştirilmiş dizenin çalışması için nginx 0.9.0 veya daha yüksek bir sürüme ihtiyacınız olacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.