Czy istnieje elegancki sposób na zablokowanie grupy polecających jednocześnie?

21

W celu uniknięcia spamu odsyłającego mój plik nginx.conf zawiera następującą sekcję:

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

Reguły te mówią nginxowi, aby zamknął połączenie, jeśli użytkownik ma ustawione jedno z tych poleceń. Czy jest na to bardziej elegancki sposób? Czy mogę zdefiniować listę tych domen, a następnie powiedzieć coś takiego: „Jeśli polecający jest na tej liście, zwróć 444”?

bdesham
źródło
utwórz jeden duży plik podobny do tego z próbki i użyj go jako plik dołączany, jeśli to konieczne.
Hrvoje Špoljar

Odpowiedzi:

31

Spróbowałbym map:

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

Następnie użyj go w następujący sposób:

if ($bad_referer) {
    return 444;
}
Michael Hampton
źródło
1
Ponieważ mapa wykorzystuje tabele skrótów, to podejście będzie działać lepiej niż seria pojedynczych kontroli. Czytaj docs dla opcji, które mogą być wykorzystane, jak hostnamesi possiblely includeosobnego pliku, w którym są notowane mógł łatwiej utrzymać.
Brian
Czytając dokumenty związane z mapbyłem zainteresowany, aby sprawdzić, czy można użyć wyrażenia regularnego, aby dopasować określone strony odsyłające, ponieważ OP wykonuje dopasowanie wyrażenia regularnego za pomocą ~*operatora, a nawet po prostu określając regułę mapy, tak jak "~*spamdomain4.com" 1;to zrobi. Schludny!
Hrvoje Špoljar
Masz rację i to i tak musi z tego skorzystać.
Michael Hampton
Korzystając z hostnamesopcji, byłoby to po prostu.spamdomain4.com 1;
Brian
4
@Brian Pole strony odsyłającej to pełny adres URL, a nie tylko nazwa hosta. Więc to nie działa.
Michael Hampton
13

Możesz użyć logiki, ORaby stworzyć jedną instrukcję wielokrotnego dopasowania, np

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

EDYCJA na komentarz; usuwanie break;z bloku

Hrvoje Špoljar
źródło
2
Dyrektywa break nigdy nie zostanie osiągnięta, ponieważ return zatrzymuje przetwarzanie bieżącego żądania.
Xavier Lucas