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


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Špoljar2014年

Answers:


31

我会尝试map

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

然后像这样使用它:

if ($bad_referer) {
    return 444;
}

1
由于map使用哈希表,因此此方法的效果将优于一系列单独的检查。阅读文档以获取可能使用的选项,例如列出其中一个单独文件的hostnames可能include,并且可能更易于维护。
Brian

阅读与map我相关的文档很有趣,因为OP正在使用~*运算符进行正则表达式匹配,因此是否可以使用正则表达式来匹配某些引荐来源,并且确实只需指定映射规则"~*spamdomain4.com" 1;就可以解决问题。整齐!
HrvojeŠpoljar2014年

您是对的,而且无论如何都需要使用它。
迈克尔·汉普顿

使用该hostnames选项将非常简单.spamdomain4.com 1;
Brian

4
@Brian引荐来源字段是一个完整的URL,而不仅仅是一个主机名。所以那行不通。
迈克尔·汉普顿

13

您可以使用逻辑OR来编写一个多匹配语句,例如

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

按评论编辑break;从块中删除


2
break指令将永远不会到达,因为return会停止当前请求的处理。
Xavier Lucas 2014年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.