Existe uma maneira elegante de bloquear um grupo de referenciadores de uma só vez?

20

Para evitar spam de referenciador, meu nginx.conf contém uma seção como esta:

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

Essas regras informam ao nginx apenas para fechar a conexão se o usuário tiver um desses referenciadores definidos. Existe uma maneira mais elegante de fazer isso? Posso definir uma lista desses domínios e, em seguida, dizer algo como: "Se o referenciador estiver nessa lista, retorne 444"?

    
por bdesham 22.11.2014 / 18:46

3 respostas

28

Eu tentaria um map :

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

Em seguida, use da seguinte forma:

if ($bad_referer) {
    return 444;
}
    
por 22.11.2014 / 18:50
13

Você pode usar o% lógicoOR para criar uma declaração de correspondência múltipla, por exemplo,

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

EDITAR por comentário; removendo break; do bloco

    
por 22.11.2014 / 18:51
3

ngx_http_referer_module é outra maneira de fazer isso. Exemplo de Bloqueio de spam de referência :

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

  if ($invalid_referer) {
    return   403;
  }
}
    
por 09.02.2016 / 12:32

Tags