为了防止 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;
}
}