Gibt es eine elegante Möglichkeit, mehrere Referrer gleichzeitig zu blockieren?

Gibt es eine elegante Möglichkeit, mehrere Referrer gleichzeitig zu blockieren?

Um Referrer-Spam zu verhindern, 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 sagen nginx, die Verbindung 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 Domänen definieren und dann etwas sagen wie: „Wenn der Referrer in dieser Liste ist, gib 444 zurück“?

Antwort1

Ich würde versuchen,map:

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

Dann verwenden Sie es folgendermaßen:

if ($bad_referer) {
    return 444;
}

Antwort2

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

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

BEARBEITENpro Kommentar; Entfernen break;aus dem Block

Antwort3

ngx_http_referer_moduleist eine andere Möglichkeit, dies zu tun. Beispiel ausReferrer-Spam-Blockierung:

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

  if ($invalid_referer) {
    return   403;
  }
}

verwandte Informationen