Nginx - Umleiten von Benutzern mit einer bestimmten IP-Adresse auf eine bestimmte Seite


26

Ich habe eine ziemlich große Bildergalerie und es gibt 5 Besucher, die durch das tägliche Herunterladen der gesamten Website mit Hilfe von Webkopierern einen enormen Datenverkehr verursachen. Diese Besucher haben anscheinend statische IP-Adressen. Was ich erreichen möchte, ist, dass diese 5 IPs zu einer bestimmten Seite umgeleitet werden (was erklärt, warum ihr Verhalten problematisch ist), sobald sie die Site besuchen. Alle anderen Besucher sollten in der Lage sein, die Site normal zu durchsuchen.

Auf dem Server werden CentOS (5.8) und Nginx (1.0.15) als Webserver ausgeführt. Gibt es eine Möglichkeit, dies durch einen Ihnen bekannten Eintrag in der nginx.conf zu erreichen?

Vielen Dank im Voraus für Ihre Hinweise und Unterstützung!

Herzliche Grüße -Alex

Antworten:


34

Das Geo- Modul stimmt mit den Client-Adressen überein. Sie können es verwenden, um eine Variable zu definieren, die wie folgt getestet werden soll:

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

Dies ist effizienter als die Ausführung einer regulären Ausdrücke für $ remote_addr und einfacher zu warten.


Vielen Dank - es funktioniert super mit Geo! Nur eine Sache: Es werden nur Anfragen an domain.com umgeleitet und keine direkten Anfragen wie domain.com/file.ext oder domain.com/subdirectory/file.ext. Wie erreiche ich das? Leider bin ich ein ziemlicher RegEx Noob. :(
Alex

Wo hast du das Wenn hingelegt? Können Sie den gesamten Serverblock bereitstellen? Nach einigem Nachdenken ist es nicht die beste Idee, das if direkt auf den Server zu stellen, da es sogar für eine Anfrage an /noscrape.html
kolbyjack am

20

Mit HttpAccessModule können Sie dies schnell erledigen .

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

Vielen Dank, Khaled! Gibt es eine Möglichkeit, mehrere IPs in diese Richtlinie aufzunehmen?
Alex

Sorry, ich bin ein bisschen verwirrt (neu hier) - Hat Matt die Frage beantwortet oder Khaled? Vielen Dank jedoch an euch beide! ;)
Alex

1
Dies verwendet tatsächlich das Rewrite-Modul . Sie können einen regulären Ausdruck wie diesen: if ($remote_addr ~ "^(1.2.3.4|4.3.2.1)$").
mgorven

Meiner nginx -VMeinung nach gibt es kein solches Modul, aber es funktioniert. Vielleicht ist es erstmal eingebaut.
user3132194

1

Wenn Sie zu einer anderen Seite in derselben Domain umgeleitet haben und die obigen Beispiele befolgt haben, wird eine direkte Schleife ausgelöst. Verwenden Sie in Ihrer Nginx-Konfigurationsdatei Folgendes (ich gehe davon aus, dass Sie WordPress verwenden, da es weit verbreitet ist)

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

}

Wenn nun jemand von der IP-Adresse, die auf der schwarzen Liste steht, eine Seite mit Ausnahme der Warnseite besucht, die nicht auf der Website aufgeführt ist, wird er auf die Warnseite weitergeleitet. Da sich das Umschreiben an der Position / im Block befindet, wird keine Umleitungsschleife ausgelöst. Befindet es sich jedoch innerhalb des Serverblocks, wird eine Umleitungsschleife ausgelöst.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.