Existe-t-il un moyen élégant de bloquer un groupe de référents à la fois?


21

Afin d'éviter le spam référent, mon nginx.conf contient une section comme celle-ci:

if ($http_referer ~* spamdomain1\.com) {
    return 444;
}
if ($http_referer ~* spamdomain2\.com) {
    return 444;
}
if ($http_referer ~* spamdomain3\.com) {
    return 444;
}

Ces règles indiquent à nginx de fermer la connexion uniquement si l'utilisateur a défini l'un de ces référents. Existe-t-il une manière plus élégante de procéder? Puis-je définir une liste de ces domaines et dire ensuite quelque chose comme: «Si le référent est dans cette liste, retournez 444»?


créez un gros fichier similaire à celui de l'exemple et utilisez-le comme fichier d'inclusion si nécessaire
Hrvoje Špoljar

Réponses:


31

J'essaierais un map:

map $http_referer $bad_referer {
    default                  0;
    "~spamdomain1.com"       1;
    "~spamdomain2.com"       1;
    "~spamdomain3.com"       1;
}

Ensuite, utilisez-le comme ceci:

if ($bad_referer) {
    return 444;
}

1
Étant donné que la carte utilise des tables de hachage, cette approche fonctionnera mieux qu'une série de vérifications individuelles. Lisez les documents pour les options qui pourraient être utilisées, comme hostnameset éventuellement includeun fichier séparé où elles sont répertoriées pourraient faciliter la maintenance.
Brian

La lecture des documents liés à mapJ'étais intéressé de voir si on pouvait utiliser regex pour correspondre à certains référents puisque OP fait une correspondance regex en utilisant l' ~*opérateur, et en effet simplement spécifier une règle de carte comme "~*spamdomain4.com" 1;fera l'affaire. Soigné!
Hrvoje Špoljar

Vous avez raison, et cela doit quand même être utilisé.
Michael Hampton

En utilisant l' hostnamesoption, ce serait simplement.spamdomain4.com 1;
Brian

4
@Brian Le champ référent est une URL complète, pas simplement un nom d'hôte. Donc ça ne marche pas.
Michael Hampton

13

Vous pouvez utiliser logique ORpour créer une déclaration de correspondance multiple, par exemple

if ($http_referer ~ "spamdomain1\.com|spamdomain2\.com|spamdomain3\.com")  { 
  return 444;
}

EDIT par commentaire; retrait break;du bloc


2
La directive break ne sera jamais atteinte car return arrête le traitement de la requête en cours.
Xavier Lucas

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.