博主目前在一家原创小说网站公司工作,由于站内的作品全部是原创,于是乎不可避免地会被一些盗版网站爬取盗版,对于防盗版一直没有很好的对策,让公司很是苦恼。
最近去一些盗版网站上搜索我们网站作品时,发现他们所用的封面图片的来源是我们网站的地址,即所谓的盗链,这对于我们网站服务器的带宽是一种损失,因此需要采取对应的手段应对。
这里我使用两台虚拟机 虚拟机的快速安装可以参考我另外一篇博文 CentOS快速安装
参考博文 Nginx缓存配置 的 Nginx 环境搭建部分。
# 修改 nginx.conf 配置文件
vim /usr/local/nginx/conf/nginx.conf
# 添加 server 节点
server {
listen 80;
server_name www.vcmq.com;
#access_log logs/host.access.log main;
location ~* \.(jpg|png|gif)$ {
root /home/resources;
valid_referers none server_names *.test1.com ~\.test2\.;
if ($invalid_referer){
rewrite ^/ http://ojt4b2cr5.bkt.clouddn.com/blog/20171028/214345352.png;
}
}
location / {
root html;
index index.html index.htm;
}
}
可以看到,我新增的 server 的地址是 www.vcmq.com。
location ~* \.(jpg|png|gif)$
此行配置的作用是匹配以 jpg/png/gif 结尾的文件请求, 如果匹配就执行 括号内的代码。
valid_referers none server_names *.test1.com ~\.test2\.;
if ($invalid_referer){
rewrite ^/ http://ojt4b2cr5.bkt.clouddn.com/blog/20171028/214345352.png;
}
首先看第一行,这行的作用是配置可以识别 refer,即可以正常获取资源文件的请求,在这里配置加入白名单的请求 refer 域名。
参数说明:
www.vcmq.com/test1.png
,直接访问时,refer 会为空。server_names
即 location
的父节点 server
节点的 server_name
的值。*.test1.com
,配置后,来源是从 test1.com
就会被认为是合法的请求。~\.test2\.
当请求的 refer
是合法的,即可以被后面任一参数所匹配, $invalid_referer
的值为0, 若不匹配则值为 1, 进入 if
的代码中。我这里的设置是,如果是不合法的请求,就统一返回一张图片,也可以直接返回 403
。
1.在 /home
目录下创建目录 resources
,在 /home/resources
目录下放入一张图片 test.png。
2.修改 nginx
安装目录下 html
中的 index.html
文件。添加一个 img 标签,src 访问上一步中的图片文件
<img src="http://www.vcmq.com/test.png" />
3.启动 nginx
/usr/local/nginx/sbin/nginx
4.以上所有配置是对于服务器 A 的配置,以下讲解服务器 B 的配置
server {
listen 80;
server_name www.test1.com;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
}
server {
listen 80;
server_name www.test2.com;
location / {
root html;
index index.html index.htm;
}
}
<img src="http://www.vcmq.com/test.png" />
我上面配置的 server_name 配置的域名是 www.vcmq.com ,因此测试时,需要将我电脑的 host 指向虚拟机的 ip, 可以使用 SwitchHosts 来便捷切换。
# 指向服务器A
192.168.200.130 www.vcmq.com
# 指向服务器B
192.168.200.131 www.test1.com www.test2.com
www.test1.com
与 www.test2.com
还有直接访问图片 http://www.vcmq.com/test.png
都正常加载valid_referers none server_names *.test1.com ~\.test2\.;
将此行修改为
valid_referers none server_names;
即只允许当前 server_name 与 无 refer 的请求,其他请求都返回 rewrite 的图片, 然后重启 nginx
/usr/local/nginx/sbin/nginx -s reload
再次分别访问 ,注意需要使用 ctrl+F5 刷新一下缓存
www.vcmq.com
、www.test1.com
、www.test2.com
、http://www.vcmq.com/test.png
。
发现只有 www.vcmq.com
与 http://www.vcmq.com/test.png
正常显示,其他请求皆返回 rewrite 的图片
同理再次修改 nginx.conf 文件, 允许来自 test1 的访问请求
valid_referers none server_names *.test1.com;
结果发现
www.test1.com
可以获取正常图片,而www.test2.com
还是 rewrite 之后的图片
至此,已经实现了基于 Nginx 的简单图片防盗链。
实际应用中,可以设置允许来自公司下的域名与空 refer 的请求通过。
这里允许 空 refer 的请求通过的原因是,有些合法的请求可能会没有带上 refer。
原文:https://www.cnblogs.com/vcmq/p/9484385.html