¿Existe una forma elegante de bloquear un grupo de referentes a la vez?

¿Existe una forma elegante de bloquear un grupo de referentes a la vez?

Para evitar el spam de referencias, mi nginx.conf contiene una sección como esta:

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

Estas reglas le dicen a nginx que simplemente cierre la conexión si el usuario tiene configurada una de estas referencias. ¿Existe una forma más elegante de hacer esto? ¿Puedo definir una lista de estos dominios y luego decir algo como "Si el referente está en esta lista, entonces devuelve 444"?

Respuesta1

probaría unmap:

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

Entonces úsalo así:

if ($bad_referer) {
    return 444;
}

Respuesta2

Podría utilizar la lógica ORpara elaborar una declaración de coincidencias múltiples, por ejemplo

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

EDITARpor comentario; quitando break;del bloque

Respuesta3

ngx_http_referer_modulees otra forma de hacerlo. Ejemplo deBloqueo de spam de referencia:

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

  if ($invalid_referer) {
    return   403;
  }
}

información relacionada