NGINX 简单防盗链的应用

本贴最后更新于 2483 天前,其中的信息可能已经时过境迁

什么是防盗链

什么是防盗链?比如我们的网站上有一些非常漂亮的图片资源,另外一个网站的站长也喜欢,想把这些图片放到自己的网站上去,所以他就将我们网站上的图片资源的连接放到了他的网站上进行展示,而这过程中只会对我们的服务器产生消耗,对他的服务器并不会产生消耗,这就是盗链。所以对于这种行为我们应该对其禁止。

Nginx 中的防盗链

要防盗链首先我们需要区分哪些是属于正常的访问哪些是不正常的访问,要让正常的用户能正常的访问到资源;
在 Nginx 中可以通过 http_referer_module 模块来进行设置。

http_referer_module

http_referer_module 模块用于在 Referer 字段中阻止无效值得请求;
Referer 字段用来向服务端传递本次请求资源是从哪个地址来的,比如在 www.a.com 的首页 index.html 中有一个连接是访问 www.b.com 的 index.html 的,当我点了这个连接转到 www.b.com/index.html 上后,那么请求 www.b.com/index.htmlReferer 就是 www.a.com/index.html。

valid_referers 指令配置语法
Syntax:	valid_referers none | blocked | server_names | string ...;
Default:	—
Context:	server, location

用来控制允许访问的 Referer 类型;
none 表示允许没有携带 Referer 信息的访问;
blocked 表示允许不带有标准协议头(http://,https://)的 Referer 信息访问;
server_name 允许某个域来请求。他其实控制的是 $invalid_referer 这个变量,如果 Refererserver_name 匹配不上,那么 $invalid_referer 这个变量的值就等于 1,否则为空。
所以我们可以用一条判断语句来判断 $invalid_referer 变量的值是否为 1 ,如果为 1 就将其拒绝。

示例
server {
    listen       80;
    server_name  www.b.com;

    root   /opt/web_b/;
    index  index.html index.htm;

    location ~ .*\.(jpg|jpeg|gif|png|ico)$ {
        valid_referers none blocked www.c.com;
        if ($invalid_referer) {
                return 403;
        }       
    }

在上面我们对 www.b.com 这个虚拟主机做了配置,对站点中的图片只允许 www.c.com 域名来访问,对于从其他地址来的都给响应 403 错误。

www.a.com 的页面中插入 www.b.com 站点中的一张图片

87e6fd762e6d4b2b804a60b19fdb763e-validreferers1img.png

可以看到 www.a.com 页面中自己的内容能正常显示,但是来自 www.b.com 站点的图片没有显示出来,出现了 403 错误。

使用 curl 工具来模拟 www.c.com 的访问

e324063d73b042fd94970a0af7482dc2-validreferers2img.png

可以看到返回的状态码为 200 表示是能正常访问的。

对于 server_name 也可以使用正则表达式来匹配,正则表达式应该使用 ~ 符号开头,表达式会匹配 或 之后的内容。
例如我们需要允许来自搜索引擎的 Referer

valid_referers none blocked www.c.com ~\.google\.;

END!

  • NGINX

    NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。

    313 引用 • 547 回帖
  • 防盗链
    3 引用 • 16 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 所以 hacpai 设计了这个接口吗 ? https://hacpai.com/porter?src=? @88250

    1 回复
  • 其他回帖
  • 88250

    这个是为了代理非 HTTPS 的站外资源(特别是图片),避免混合请求破坏当前页面的 HTTPS。

    (不好意思,刚刚才看到 😂 )