Nginx - Belirli IP’yi olan kullanıcıları özel sayfaya yönlendirme


26

Oldukça büyük bir resim galerisi işletiyorum ve web sitelerini her gün siteyi indirerek çok fazla miktarda trafik yaratan 5 ziyaretçi var. Bu ziyaretçiler göründüğü gibi statik IP’lere sahip. Ulaşmak istediğim, bu 5 IP’nin siteyi ziyaret eder etmez belirli bir sayfaya (davranışlarının neden problemli olduğunu açıklayan) yönlendirilmesidir. Diğer tüm ziyaretçiler siteye normal şekilde göz atabilir.

Sunucu, web sunucusu olarak CentOS (5.8) ve nginx (1.0.15) kullanıyor. Bunu başarmanız için nginx.conf dosyasına girdiğiniz bir yol var mı?

Püf noktaları ve desteğiniz için şimdiden çok teşekkür ederiz!

Saygılarımla -Alex

Yanıtlar:


34

Coğrafi modül istemci adreslerini eşleştirmek için yapılır. Bunun gibi sınamak için bir değişken tanımlamak için kullanabilirsiniz:

geo $bad_user {
  default 0;
  1.2.3.4/32 1;
  4.3.2.1/32 1;
}

server {
  if ($bad_user) {
    rewrite ^ http://www.example.com/noscrape.html;
  }
}

Bu, $ remote_addr komutuna regex uygulamaktan daha etkili ve bakımı kolaydır.


Çok teşekkür ederim - geo kullanarak harika çalışıyor! Tek bir şey: Yalnızca istekleri domain.com adresine yönlendirir ve domain.com/file.ext ya da domain.com/subdirectory/file.ext gibi istekleri yönlendirmez. Bunu nasıl başarabilirim? Ne yazık ki, ben oldukça bir RegEx Noob. :(
Alex

İfadeyi nereye koydun? Sunucu bloğunun tamamını sağlayabilir misiniz? O /noscrape.html yapılan bir isteği bile değerlendirilecektir beri biraz daha düşündükten sonra, eğer doğrudan sunucuda koyarak, iyi bir fikir değil
kolbyjack

20

HttpAccessModule kullanarak bunu hızla gerçekleştirirsiniz.

server {
    if ($remote_addr = 1.2.3.4) {
        rewrite ^ http://www.website.com/noscrape.htm;
    }
   ...
}

Çok teşekkürler Khaled! Bu yönergeye birkaç IP eklemenin bir yolu var mı?
Alex,

Üzgünüm, kafam biraz karıştı (burada yeni) - Matt soruyu cevapladı mı yoksa Khaled mi? Ancak, ikinize de teşekkürler! ;)
Alex

1
Bu aslında Rewrite modülünü kullanır . Böyle bir düzenli ifade eşleşmesini kullanabilirsiniz: if ($remote_addr ~ "^(1.2.3.4|4.3.2.1)$").
mgorven

Benim de nginx -Vböyle bir modül olmadığını söylüyor ama işe yarıyor. Belki şimdilik yerleşiktir.
user3132194

1

Aynı etki alanındaki farklı bir sayfaya yönlendirirseniz ve yukarıdaki örnekleri izlerseniz doğrudan bir döngüye neden olur. bu nedenle nginx yapılandırma dosyanızda aşağıdakileri kullanın (yaygın olarak kullanıldığı gibi wordpress kullandığınızı varsayıyorum)

geo $bad_user {
  default 0;
  1.2.3.4/32 1;
  4.3.2.1/32 1;
}

server {
 location /
 {
  if ($bad_user) {
    rewrite ^ http://www.example.com/warning-page/ break;
  }

try_files $fullurl${request_uri}index.html $uri $uri/ /index.php$is_args$args;
 }

location /warning-page/
{
try_files $fullurl${request_uri}index.html $uri $uri/ /index.php$is_args$args;
}

}

Şimdi kara listedeki ipten biri sitede listelenen uyarı sayfası dışındaki herhangi bir sayfayı ziyaret ederse, uyarı sayfasına yönlendirilir. Yeniden yazma konumu / bloğunda olduğundan, yeniden yönlendirme döngüsüne neden olmaz. Ancak, sunucu bloğunun içindeyse, yönlendirme döngüsüne neden olur.

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.