前言
为了让图片管理起来更方便,也为了让网站中的图片显示起来更稳定,我们前面通过 MinIO 自建了图床。
至于防盗链,我一开始本来想着直接裸奔算了的。毕竟,没什么值得防的,而且我也欢迎大家来“盗”。最重要的是,裸奔的话,我自己也比较方便,文章不需要作任何修改,就可以直接在类似博客园
、github
的平台上发表。另外,也不必担心防盗链可能对各种搜索引擎的收录造成什么影响。
然而,纠结了好久,最后还是觉得应该为图床做一层最基本的防护。
1. 为何需要防盗链
其实我写文章主要就是记录一些经验心得,目的就是为了让大家看到,文中的截图也是一样的,并不会在意读者是从哪里看到的。
但考虑到有些情况,如机器人采集,文章被转载了,但文中的图片依然指向我的服务器,使其承受不该承受之重。对于一个宁愿忍受网站不稳定,也要使用 jsDelivr
作为免费图床的吝啬鬼来讲,我都强忍着通过一些骚操作把流量打到其它地方去的冲动,怎么可能忍得了别人把流量打到我的服务器上来呢?
基于这一点,我感觉图片防盗链还是很有必要的。毕竟,对个人网站而言,流量太珍贵了,因为通常情况下,CPU、内存、硬盘等其它服务器资源,基本上是用不完的,唯独带宽最容易达到瓶颈,所以能省还是应该省一点的。
2. 如何配置防盗链
前面说了那么多,全是前戏,其实防盗链配置起来特别简单。由于我们是使用 MinIO 搭建的图床,然后又通过 Nginx Proxy Manager(NPM
) 进行了反向代理。
因此,实际上我们有两种方式可以配置防盗链。一种是通过 MinIO 的管理后台编辑访问策略,如下图所示:
通过自定义配置,可以实现防盗链。但这个有些麻烦,并且不能通用,万一我们后面又换成另外一个图床呢?
而另一种是通过 NPM
实现,这是一种更简单、更通用的方式。
3. 操作步骤
经过了前面高频的出场,我想 NPM
大家已经很熟悉了,因此,这里不再介绍。直接编辑imgs.ilaozhu.com
(图床的 API 地址) 这一条,如下图所示:
转到 Advanced
标签,把下面的配置改成你自己的,然后复制进去,点击保存就可以了。
location ~* \.(gif|jpg|png|bmp)$ {
valid_referers none blocked ilaozhu.com *.ilaozhu.com ~\.google\. ~\.bing\. ~\.baidu\.;
if ($invalid_referer) {
return 403;
}
proxy_pass http://minio:9001;
}
截图如下:
怎么样?是不是很简单?
事实上,不仅简单,而且还很通用,适用于几乎所有的图床。而且 NPM
本质上就是 Nginx,因此,即使没有部署 NPM
,但只要部署了 Nginx ,就依然可以使用这种方式。
下面简单解释一下这段配置:
(gif|jpg|png|bmp)
指定防盗链的图片格式。事实上,不仅仅是图片,js
、css
、音频、视频等静态资源也是可以的;valid_referers
相当于一个白名单列表,里面配置的都是放行名单,支持正则表达式;none
表示允许请求报文中没有referer
的情况,目的是为了让图片能直接通过浏览器地址栏打开;blocked
表示允许请求报文中有referer
,但值为空或无效的情况,主要是为了应对请求通过防火墙或代理服务器时,referer
的值被删除或伪装的情形;ilaozhu.com
是允许的主域名,*.ilaozhu.com
是允许的所有子域名;~\.google\. ~\.bing\. ~\.baidu\.
等是为了不影响各大搜索引擎收录的,当然,如果还想放行其它的网站也可以继续追加,如github
等。
事实上,这种方式是一种最基础的防护手段,属于防君子不防小人的行为。如果有人恶意攻击,肯定也是防不了的。但足够了,我想真的没什么人会闲的没事来攻击我们这种小网站,毕竟,攻击也是有代价的。
4. 客户端设置
上一篇文章我们把 PicList 的 endPoint
和自定义域名
都设置成了imgs.ilaozhu,com
,但现在我们针对imgs.ilaozhu,com
配置了防盗链。因此,本地的 PicList 就无法再操作图床了。
解决这个问题也很简单,只需要为endPoint
单独分配一个不做防盗链的域名就可以了。由于前面已经操作很多次了,我相信大家都会,这次就不再截图演示了。
结语
好了,本来一行配置就搞定的事,硬是水了一篇一千多字的文章,有点佩服我自己了。不过话说回来,不难看出,Nginx Proxy Manager 真的是既方便又好用,还没用起来的赶紧也试试吧!
评论3
kk_
问下大佬的后台服务和minio服务是部署在一台机器上吗?如果需要存储大量图片,比如最大空间为500G,是不是需要一台后台服务器和一台对象存储服务器呢?
老朱
我是为了节省成本,所以部在了同一台服务器上,你这么大量的话,最好还是用对象存储服务,用多少买多少,会方便很多,而且也不占应用服务器的带宽
xyt
这个文章里有没有能加上大纲的插件啊大佬