Esiste un modo elegante per bloccare contemporaneamente un gruppo di referrer?


21

Per prevenire lo spam dei referrer, il mio nginx.conf contiene una sezione come questa:

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

Queste regole indicano a nginx di chiudere la connessione solo se l'utente ha impostato uno di questi referrer. C'è un modo più elegante per farlo? Posso definire un elenco di questi domini e quindi dire qualcosa del tipo: "Se il referrer è in questo elenco, restituisce 444"?


creare un file di grandi dimensioni simile a quello dell'esempio e usarlo come file di inclusione dove necessario.
Hrvoje Špoljar,

Risposte:


31

Vorrei provare un map:

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

Quindi usalo così:

if ($bad_referer) {
    return 444;
}

1
Poiché la mappa utilizza tabelle hash, questo approccio funzionerà meglio di una serie di controlli individuali. Leggi i documenti per le opzioni che potrebbero essere utilizzate, come hostnamese possibilmente includedi un file separato in cui sono elencate, potrebbe facilitarne la manutenzione.
Brian,

Leggendo i documenti relativi alla mapero curioso di vedere se si potesse usare espressioni regolari per abbinare determinati referenti dal OP sta facendo corrispondenza regex con ~*operatore, e in effetti semplicemente specificando regola mappa come "~*spamdomain4.com" 1;farà il trucco. ! Neat
Hrvoje Špoljar,

Hai ragione, e questo deve usarlo comunque.
Michael Hampton

Usando l' hostnamesopzione sarebbe semplicemente.spamdomain4.com 1;
Brian

4
@Brian Il campo referer è un URL completo, non semplicemente un nome host. Quindi non funziona.
Michael Hampton

13

Puoi usare la logica ORper creare un'istruzione multi-match, ad es

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

MODIFICA per commento; rimuovendo break;dal blocco


2
La direttiva di interruzione non verrà mai raggiunta poiché il ritorno interrompe l'elaborazione della richiesta corrente.
Xavier Lucas,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.