¿Hay alguna forma elegante de bloquear un grupo de referencias a la vez?


21

Para evitar el spam de referencia, 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 indican a nginx solo que cierre la conexión si el usuario tiene configurado uno de estos referentes. ¿Hay alguna 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, devuelva 444"?


cree un archivo grande como el de la muestra y úselo como archivo de inclusión cuando sea necesario.
Hrvoje Špoljar

Respuestas:


31

Intentaría un map :

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

Luego úsalo así:

if ($bad_referer) {
    return 444;
}

1
Dado que el mapa utiliza tablas hash, este enfoque funcionará mejor que una serie de comprobaciones individuales. Lea los documentos para ver las opciones que se podrían usar, como hostnamesy posiblemente includeun archivo separado donde se enumeran, podría facilitar el mantenimiento.
Brian

Al leer los documentos relacionados con mapme interesó ver si uno podría usar expresiones regulares para hacer coincidir ciertos referentes ya que OP está haciendo coincidir expresiones regulares utilizando el ~*operador, y de hecho simplemente especificando la regla del mapa como"~*spamdomain4.com" 1; hará el truco. ¡Ordenado!
Hrvoje Špoljar

Tienes razón, y esto necesita usarlo de todos modos.
Michael Hampton

Usar la hostnamesopción sería simplemente.spamdomain4.com 1;
Brian

44
@Brian El campo de referencia es una URL completa, no simplemente un nombre de host. Entonces eso no funciona.
Michael Hampton

13

Podría usar lógico ORpara elaborar una declaración de coincidencia múltiple, por ejemplo

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

EDITAR por comentario; quitando break;del bloque


2
La directiva de interrupción nunca se alcanzará ya que la devolución detiene el procesamiento de la solicitud actual.
Xavier Lucas

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.