Nginx - Jak przekierować użytkowników z określonym adresem IP na specjalną stronę


26

Prowadzę dość dużą galerię zdjęć i jest 5 odwiedzających, którzy generują olbrzymi ruch, pobierając całą witrynę codziennie za pomocą webcopier. Ci goście mają statyczne adresy IP, jak się wydaje. Chciałbym, aby te 5 adresów IP zostało przekierowanych na określoną stronę (co wyjaśnia, dlaczego ich zachowanie jest problematyczne), gdy tylko odwiedzą witrynę. Wszyscy inni odwiedzający powinni mieć możliwość normalnego przeglądania strony.

Na serwerze działają CentOS (5.8) i nginx (1.0.15) jako serwer WWW. Czy jest jakiś sposób na osiągnięcie tego przez wpis w nginx.conf, o którym wiesz?

Z góry dziękuję za wskazówki i wsparcie!

Z pozdrowieniami -Alex

Odpowiedzi:


34

Geo moduł jest wykonany, aby dopasować adresy klientów. Możesz go użyć do zdefiniowania zmiennej do testowania:

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

Jest to bardziej wydajne niż uruchamianie wyrażenia regularnego względem $ remote_addr i łatwiejsze w utrzymaniu.


Dziękuję bardzo - działa świetnie przy użyciu geo! Tylko jedna rzecz: przekierowuje tylko żądania do domain.com, a nie bezpośrednie żądania, takie jak domain.com/file.ext lub domain.com/subdirectory/file.ext. Jak to osiągnąć? Niestety jestem dość RegEx Noob. :(
Alex

Gdzie umieściłeś if? Czy możesz podać cały blok serwera? Po kilku przemyśleniach umieszczenie if bezpośrednio na serwerze nie jest najlepszym pomysłem, ponieważ zostanie ocenione nawet w przypadku żądania wysłanego do /noscrape.html
kolbyjack

20

Za pomocą HttpAccessModule sprawisz, że stanie się to szybko.

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

Dziękuję bardzo, Khaled! Czy istnieje sposób włączenia kilku adresów IP do tej dyrektywy?
Alex

Przepraszam, jestem trochę zdezorientowany (tutaj nowy) - Czy Matt odpowiedział na pytanie, czy Khaled? Jednak dzięki wam obojgu! ;)
Alex

1
To faktycznie używa modułu Rewrite . Można użyć Dopasowanie wyrażenia regularnego tak: if ($remote_addr ~ "^(1.2.3.4|4.3.2.1)$").
mgorven

My nginx -Vmówi, że nie ma takiego modułu a, ale to działa. Może na razie jest wbudowany.
user3132194,

1

Jeśli przekierowałeś na inną stronę w tej samej domenie, i jeśli wykonałeś powyższe przykłady, spowoduje to bezpośrednią pętlę. więc w pliku konfiguracyjnym nginx użyj następującego polecenia (zakładam, że używasz wordpress, ponieważ jest powszechnie używany)

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

}

Teraz, jeśli ktoś z IP z czarnej listy odwiedzi dowolną stronę oprócz strony z ostrzeżeniem, która nie jest wymieniona w witrynie, zostanie przekierowany na stronę z ostrzeżeniem. ponieważ przepisanie jest w lokalizacji / bloku, nie spowoduje pętli przekierowania. Jeśli jednak znajduje się w bloku serwera, spowoduje pętlę przekierowania.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.