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»?

bdesham
la source
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;
}
Michael Hampton
la source
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

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