Есть ли элегантный способ заблокировать сразу несколько рефереров?

Есть ли элегантный способ заблокировать сразу несколько рефереров?

Чтобы предотвратить спам рефереров, мой nginx.conf содержит такой раздел:

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

Эти правила говорят nginx просто закрыть соединение, если у пользователя установлен один из этих рефереров. Есть ли более элегантный способ сделать это? Могу ли я определить список этих доменов, а затем сказать что-то вроде: «Если реферер есть в этом списке, то вернуть 444»?

решение1

Я бы попробовалmap:

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

Затем используйте его так:

if ($bad_referer) {
    return 444;
}

решение2

Вы можете использовать логический оператор ORдля создания одного оператора множественного соответствия, например:

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

РЕДАКТИРОВАТЬза комментарий; удаление break;из блока

решение3

ngx_http_referer_moduleесть другой способ сделать это. Пример изБлокировка спама реферера:

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

  if ($invalid_referer) {
    return   403;
  }
}

Связанный контент