
Чтобы предотвратить спам рефереров, мой 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;
}
}