防止 Nginx 上的热链接

防止 Nginx 上的热链接

我正在尝试保护我的图片不被盗链。我的第一个方法是这样的:

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 是否存在。

相关内容