我正在尝试实施下载热链接保护。
我有这个代码
location /download/ {
valid_referers blocked server_names *.example.com;
if ($invalid_referer) {
return 403;
}
工作正常,这允许指定域并阻止任何不在 valid_referers 中的内容,问题是什么?我想实现一个允许使用非 referer 的指定 IP,其余的则阻止它。
这是日志显示的内容。
1.2.3.4 - - - “GET 文件.doc HTTP/2.0” 200 13050 “-” “-”
我只想要 1.2.3.4 不接受任何引荐来源。
答案1
为了防止热链接,允许空的引荐来源字符串(直接下载)就足够了。因此,您的配置可能如下所示:
valid_referers none blocked server_names *.example.com;
浏览器在加载网页中嵌入的图像时,总会在图像请求中添加 Referer 标头。
如果你确实想阻止直接下载图像,则需要在http
nginx 配置级别使用类似这样的操作:
geo $blocked {
default 1;
1.2.3.4 0;
}
然后在server
块中:
location /download/ {
valid_referers blocked server_names *.example.com;
set $refblocked $invalid_referer$blocked;
if ($refblocked = "11") { # If value of both $invalid_referer and $blocked are 1, block access.
return 403;
}
}
这里,geo
模块用于将IP地址映射到变量值,并set
用于将$invalid_referer
和组合$blocked
成单个变量,在if
语句内进行测试。
我自己还没有测试过这个确切的配置,但是原理应该是可行的。
答案2
这也应该有效:
geo $hotlink {
default $invalid_referer;
1.2.3.4 0;
}
location /download/ {
valid_referers blocked server_names *.example.com;
if ($hotlink) {
return 403;
}
}