我正在尝试保护我的图片不被盗链。我的第一个方法是这样的:
location ~* \.(png|jpg)$ {
valid_referers none blocked server_names;
if ($invalid_referer) {
return 403;
}
}
这里的问题是没有任何标签,因为如果你直接输入 URL,则没有 referer。因此,如果用户直接输入 URL,每个网站仍然可以显示我的图片。所以我删除了没有任何标签,令人惊讶的是它仍然在我的网站上起作用。
如果我直接输入我的网址,它仍然有效。但为什么呢?
现在我的 referer 是空的,但我仍然可以看到我的图片。它肯定有效,因为服务器名称标签,但据我了解服务器名称意思是如果有人在 referer 中输入了我的服务器名称,他们就可以显示我的图片。但如果我直接输入我的 URL,就没有 referer。
谁可以给我解释一下这个?
答案1
这在以下文档中有很好的解释valid_referers
:
none
Referer
请求标头中缺少该字段;
blocked
该
Referer
字段在请求标头中存在,但其值已被防火墙或代理服务器删除;此类值是不以http://
或开头的字符串https://
;
server_names
请求
Referer
头字段包含其中一个服务器名称;
它的行为正如它应该的那样:none
允许没有任何引荐来源的请求以及与server_names
您的服务器名称相匹配的引荐来源。
此设置用于防止热链接,即在其他网站上嵌入您的图片。如果您知道 URL(例如,如果您在页面源代码中查找 URL),则不应阻止查看图片。
此外,您首先必须考虑网站的可用性。毕竟,您只想向在其页面上使用图片的人表明立场,而不是向实际查看图片的人表明立场。某些浏览器或防火墙可能会删除 referer,从而导致图片在不允许时甚至在您自己的网站上消失none
。
如果您希望非常严格(我不建议这样做),那么您根本不需要依赖 referer。相反,您可以在页面上设置有限时间的 cookie,并在尝试访问图像时检查该 cookie 是否存在。