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

21

Um 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 weisen nginx an, die Verbindung nur zu schließen, wenn der Benutzer einen dieser Referrer festgelegt hat. Gibt es eine elegantere Möglichkeit, dies zu tun? Kann ich eine Liste dieser Domains definieren und dann etwa sagen: "Wenn sich der Referrer in dieser Liste befindet, dann geben Sie 444 zurück."

bdesham
quelle
Erstellen Sie eine große Datei wie die aus dem Beispiel und verwenden Sie sie bei Bedarf als Include-Datei.
Hrvoje Špoljar

Antworten:

31

Ich würde versuchen ein map:

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

Dann benutze es wie folgt:

if ($bad_referer) {
    return 444;
}
Michael Hampton
quelle
1
Da die Karte eine Hash-Tabelle verwendet, ist dieser Ansatz besser als eine Reihe von Einzelprüfungen. Lesen Sie in den Dokumenten nach, welche Optionen verwendet werden könnten, beispielsweise hostnamesund möglicherweise includein einer separaten Datei, in der sie aufgelistet sind, um die Wartung zu vereinfachen.
Brian
Beim Lesen der Dokumente zu diesem Thema war mapich daran interessiert, ob man Regex verwenden kann, um bestimmte Referrer zuzuordnen, da OP den Regex-Abgleich mit dem ~*Operator durchführt, und in der Tat die einfache Angabe der Map-Regel, wie "~*spamdomain4.com" 1;es der Trick ist. Ordentlich!
Hrvoje Špoljar
Du hast recht, und das muss es trotzdem benutzen.
Michael Hampton
Mit der hostnamesOption wäre es einfach.spamdomain4.com 1;
Brian
4
@Brian Das Referer-Feld ist eine vollständige URL, nicht nur ein Hostname. Das funktioniert also nicht.
Michael Hampton
13

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

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

BEARBEITEN per Kommentar; Entfernen break;aus dem Block

Hrvoje Špoljar
quelle
2
Die break-Direktive wird niemals erreicht, da return die Verarbeitung der aktuellen Anfrage stoppt.
Xavier Lucas
3

ngx_http_referer_module ist eine andere Möglichkeit, dies zu tun. Beispiel aus Referer Spam Blocking :

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

  if ($invalid_referer) {
    return   403;
  }
}
davejenx
quelle