Frage Nginx - Umleiten von Benutzern mit bestimmter IP-Adresse auf eine spezielle Seite


Ich betreibe eine ziemlich große Bildergalerie und es gibt 5 Besucher, die eine enorme Menge an Traffic generieren, indem sie die ganze Seite jeden Tag mit Webcopiers herunterladen. Diese Besucher haben statische IPs, wie es scheint. Was ich erreichen möchte, ist, dass diese 5 IPs auf eine bestimmte Seite umgeleitet werden (was erklärt, warum ihr Verhalten problematisch ist), sobald sie die Seite besuchen. Alle anderen Besucher sollten in der Lage sein, die Site normal zu durchsuchen.

Auf dem Server laufen CentOS (5.8) und nginx (1.0.15) als Webserver. Gibt es eine Möglichkeit, dies durch einen Eintrag in nginx.conf zu erreichen, den Sie kennen?

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

Mit freundlichen Grüßen -Alex


19
2018-04-18 12:42


Ursprung




Antworten:


Das Geo Modul wird gemacht, um Kundenadressen zu entsprechen. Sie können damit eine zu testende Variable definieren:

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 das Ausführen einer Regex gegen $ remote_addr und einfacher zu verwalten.


26
2018-04-18 19:41



Vielen Dank - es funktioniert super mit Geo! Nur eines: Es leitet nur Anfragen an domain.com um und keine direkten Anfragen wie domain.com/file.ext oder domain.com/subdirectory/file.ext. Wie erreiche ich das? Leider bin ich ein ziemlich RegEx Noob. :( - Alex
Wo hast du das wenn? Können Sie den gesamten Serverblock bereitstellen? Nach einigem Nachdenken ist es nicht die beste Idee, das if direkt in den Server zu stellen, da es auch für eine Anfrage an /noscrape.html ausgewertet wird - kolbyjack


Verwenden HttpAccessModule Sie werden dies schnell geschehen lassen.

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

15
2018-04-18 12:49



Vielen Dank, Khaled! Gibt es eine Möglichkeit, mehrere IPs in diese Richtlinie aufzunehmen? - Alex
Entschuldigung, ich bin ein wenig verwirrt (neu hier) - Hat Matt die Frage oder Khaled beantwortet? Aber danke euch beiden! ;) - Alex
Dies verwendet tatsächlich die Modul neu schreiben. Sie können eine Übereinstimmung mit einem regulären Ausdruck wie folgt verwenden: if ($remote_addr ~ "^(1.2.3.4|4.3.2.1)$"). - mgorven
Meine nginx -V sagt, dass es kein solches Modul gibt, aber es funktioniert. Vielleicht ist es für jetzt gebaut. - user3132194


Wenn Sie auf eine andere Seite in der gleichen Domäne umgeleitet wurden, und wenn Sie den obigen Beispielen gefolgt sind, wird dies zu einer direkten Schleife führen. Verwenden Sie in Ihrer Nginx-Konfigurationsdatei wie folgt (ich nehme an, 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 aus der Blacklist ip eine Seite mit Ausnahme der Warnungsseite besucht, die auf der Site nicht gelistet ist, wird er auf die Warnungsseite weitergeleitet. Da sich das Neuschreiben in der Position / dem Block befindet, wird keine Umleitungsschleife verursacht. Wenn es sich jedoch innerhalb des Serverblocks befindet, wird eine Umleitungsschleife verursacht.


0
2017-07-19 14:38