Чтобы предотвратить спам реферера, в моем 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»?
Ответы:
Я бы попробовал
map
:Тогда используйте это так:
источник
hostnames
и, возможно,include
отдельный файл, в котором они перечислены, чтобы упростить его обслуживание.map
мне было интересно посмотреть, можно ли использовать регулярное выражение для сопоставления с определенными ссылками, так как OP выполняет сопоставление регулярного выражения с использованием~*
оператора, и, действительно, простое указание правила карты, как это"~*spamdomain4.com" 1;
будет сделано. Ухоженная!hostnames
опцию, это было бы просто.spamdomain4.com 1;
Вы можете использовать логический
OR
для создания одного оператора множественного совпадения, напримерРЕДАКТИРОВАТЬ за комментарий; снятие
break;
с блокаисточник
ngx_http_referer_module - еще один способ сделать это. Пример блокирования спама от Referer :
источник