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


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.