Existe uma maneira elegante de bloquear vários referenciadores de uma só vez?

Existe uma maneira elegante de bloquear vários referenciadores de uma só vez?

Para evitar spam de referência, 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 dizem ao nginx apenas para fechar a conexão se o usuário tiver um desses referenciadores configurado. Existe uma maneira mais elegante de fazer isso? Posso definir uma lista desses domínios e dizer algo como “Se o referenciador estiver nesta lista, retorne 444”?

Responder1

eu tentaria ummap:

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

Então use assim:

if ($bad_referer) {
    return 444;
}

Responder2

Você poderia usar lógica ORpara criar uma instrução multicorrespondência, por exemplo

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

EDITARpor comentário; removendo break;do bloco

Responder3

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

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

  if ($invalid_referer) {
    return   403;
  }
}

informação relacionada