Frage Gibt es eine elegante Möglichkeit, eine Reihe von Referrern gleichzeitig zu blockieren?


Um Referrer-Spam zu vermeiden, enthält meine nginx.conf einen Abschnitt wie diesen:

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

Diese Regeln teilen nginx mit, die Verbindung nur zu schließen, wenn der Benutzer einen dieser Verweiser eingestellt hat. Gibt es einen eleganteren Weg, dies zu tun? Kann ich eine Liste dieser Domains definieren und dann so etwas wie sagen: "Wenn der Referrer in dieser Liste ist, dann gebe 444 zurück"?


20
2017-11-22 17:46


Ursprung


Erstellen Sie eine große Datei, ähnlich der aus Beispiel, und verwenden Sie sie als Include-Datei, falls erforderlich. - Hrvoje Špoljar


Antworten:


Ich würde es versuchen map:

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

Dann benutze es so:

if ($bad_referer) {
    return 444;
}

28
2017-11-22 17:50



Da Map eine Hash-Tabelle verwendet, wird diese Methode besser funktionieren als eine Reihe einzelner Prüfungen. Lesen Sie die Dokumentation für Optionen, die verwendet werden können, wie hostnames und möglicherweise include einer separaten Datei, in der sie aufgeführt sind, könnte die Pflege erleichtern. - Brian
Die Dokumente lesen, die mit verwandt sind map Ich war interessiert zu sehen, ob man Regex verwenden könnte, um bestimmte Referrer zu finden, da OP Regex Matching mit verwendet ~* Operator, und in der Tat einfach Map-Regel wie angeben "~*spamdomain4.com" 1; wird den Trick machen. Ordentlich! - Hrvoje Špoljar
Du hast Recht, und das muss es trotzdem verwenden. - Michael Hampton♦
Verwendung der hostnames Option wäre es einfach .spamdomain4.com 1; - Brian
@ Brian Das Referer-Feld ist eine vollständige URL, nicht einfach ein Hostname. Das funktioniert also nicht. - Michael Hampton♦


Sie könnten logisch verwenden OR um eine Multi-Match-Anweisung zu erstellen, z.B.

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

BEARBEITEN pro Kommentar; entfernen break; Von dem Block


13
2017-11-22 17:51



Die break-Direktive wird niemals erreicht werden, da die Verarbeitung der aktuellen Anfrage durch return beendet wird. - Xavier Lucas


ngx_http_referer_module ist eine andere Möglichkeit, es zu tun. Beispiel aus Referrer Spam Blockierung:

location / {
  valid_referers none blocked *.badreferer1.com badreferer2.com *.badreferer3.com badreferer4.net;

  if ($invalid_referer) {
    return   403;
  }
}

3
2018-02-09 11:32