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."


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

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


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.