Nginx - Comment rediriger des utilisateurs avec une certaine IP vers une page spéciale

26

Je gère une assez grande galerie d'images et il y a 5 visiteurs qui créent une énorme quantité de trafic en téléchargeant le site entier chaque jour à l'aide de copieurs Web. Ces visiteurs ont des adresses IP statiques comme il semble. Ce que j'aimerais réaliser, c'est que ces 5 adresses IP soient redirigées vers une certaine page (ce qui explique pourquoi leur comportement est problématique) dès qu'elles visitent le site. Tous les autres visiteurs devraient pouvoir naviguer normalement sur le site.

Le serveur exécute CentOS (5.8) et nginx (1.0.15) en tant que serveur Web. Existe-t-il un moyen d'y parvenir par une entrée dans nginx.conf que vous connaissez?

Merci d'avance pour vos conseils et votre soutien!

Cordialement -Alex

Alex
la source

Réponses:

34

Le module Geo est conçu pour faire correspondre les adresses des clients. Vous pouvez l'utiliser pour définir une variable à tester comme ceci:

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

C'est plus efficace que d'exécuter une expression régulière contre $ remote_addr, et plus facile à maintenir.

kolbyjack
la source
Merci beaucoup - cela fonctionne très bien en utilisant la géo! Une seule chose: il redirige uniquement les demandes vers domain.com et non les demandes directes comme domain.com/file.ext ou domain.com/subdirectory/file.ext. Comment puis-je y parvenir? Malheureusement, je suis tout à fait un RegEx Noob. :(
Alex
Où avez-vous mis le si? Pouvez-vous fournir l'intégralité du bloc serveur? Après réflexion, mettre le if directement dans le serveur n'est pas la meilleure idée, car il sera évalué même pour une demande à /noscrape.html
kolbyjack
20

En utilisant HttpAccessModule, vous y arriverez rapidement.

server {
    if ($remote_addr = 1.2.3.4) {
        rewrite ^ http://www.website.com/noscrape.htm;
    }
   ...
}
Khaled
la source
Merci beaucoup, Khaled! Existe-t-il un moyen d'inclure plusieurs adresses IP dans cette directive?
Alex
Désolé, je suis un peu confus (nouveau ici) - Matt a-t-il répondu à la question ou Khaled? Cependant, merci à vous deux! ;)
Alex
1
Cela utilise en fait le module de réécriture . Vous pouvez utiliser une expression régulière comme ceci: if ($remote_addr ~ "^(1.2.3.4|4.3.2.1)$").
mgorven
Mon nginx -Vdit qu'il n'y a pas un tel module, mais cela fonctionne. Peut-être qu'il est intégré pour l'instant.
user3132194
1

Si vous avez redirigé vers une page différente dans le même domaine, et si vous avez suivi les exemples ci-dessus, cela provoquera une boucle directe. donc dans votre fichier de configuration nginx, utilisez comme suit (je suppose que vous utilisez wordpress car il est largement utilisé)

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

}

Maintenant, si quelqu'un de l'IP sur liste noire a visité une page à l'exception de la page d'avertissement qui n'est pas répertoriée dans le site, il sera redirigé vers la page d'avertissement. puisque la réécriture est dans l'emplacement / le bloc, elle ne provoquera pas de boucle de redirection. Cependant, s'il se trouve à l'intérieur du bloc serveur, cela provoquera une boucle de redirection.

Don Dilanga
la source