Чи є елегантний спосіб одразу заблокувати купу референтів?


21

Щоб запобігти спам-реферату, мій 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"?


створити один великий файл, подібний до зразка, і використовувати його, як включити файл, де потрібно.
Hrvoje Špoljar

Відповіді:


31

Я б спробував map:

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

Потім використовуйте його так:

if ($bad_referer) {
    return 444;
}

1
Оскільки карта використовує хеш-таблиці, цей підхід буде краще, ніж ряд індивідуальних перевірок. Прочитайте документи щодо параметрів, які можуть бути використані, як, hostnamesі, можливо, includeокремого файлу, де вони перераховані, це може полегшити підтримку.
Брайан

Читаючи документи, пов’язані з mapмені, мені було цікаво побачити, чи можна використовувати регулярний вираз, щоб відповідати певним референтам, оскільки ОП проводить відповідність регулярного виразу за допомогою ~*оператора, і справді просто вказавши правило карти, як "~*spamdomain4.com" 1;це зробить трюк. Акуратно!
Хрвой Шполяр

Ви маєте рацію, і для цього потрібно скористатися.
Майкл Хемптон

Використовувати hostnamesваріант було б просто.spamdomain4.com 1;
Брайан

4
@Brian Поле реферера - це повна URL-адреса, а не просто ім'я хоста. Так що це не працює.
Майкл Хемптон

13

Ви можете використовувати логіку ORдля створення одного оператора з кількома відповідностями, наприклад

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

Редагувати за коментарем; видалення break;з блоку


2
Директива про перерву ніколи не буде досягнута, оскільки віддача зупиняє обробку поточного запиту.
Ксав'є Лукас

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.