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

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.


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

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.