是否有一种优雅的方法可以一次性阻止大量引荐来源?

是否有一种优雅的方法可以一次性阻止大量引荐来源?

为了防止 referrer spam,我的 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;
  }
}

相关内容