Nginx对图片进行防盗链
这里需要使用两台Linux主机(一台充当防盗链服务器,一台充当盗链服务器),下表是它们所使用的操作系统以及IP地址。
|
两台Linux主机所使用的操作系统以及IP地址 |
||
| 主机名称 | 操作系统 | IP地址 |
| 防盗链服务器 | CentOS7.5 | 192.168.5.23 |
| 盗链服务器 | CentOS6.10 | 192.168.5.154 |
两台Linux主机的Nginx采用yum安装,版本都是1.16.1
一、nginx模块ngx_http_referer_module指令简介
nginx中ngx_http_referer_module模块允许拦截“Referer”请求头中含有非法值的请求,阻止它们访问站点。 需要注意的是伪造一个有效的“Referer”请求头是非常容易的, 因此这个模块的预期目的不在于彻底地阻止这些非法请求,而是为了阻止由正常浏览器发出的大规模此类请求(提高了技术门槛,可以限制多数普通用户)。 还有一点需要注意,即使正常浏览器发送的合法请求,也可能没有“Referer”请求头,所以有时候不能拒绝来源头部“Referer”为空的请求。
防盗链配置语法
语法:valid_referers none | blocked | server_names | string ...;
可以配置在server或者location节点里
参数说明
none:缺少“Referer” 请求头的情况;
blocked:“Referer”请求头存在,但是它的值被代理服务器或者防火墙删除了,所以无法跟据“Referer”的值来进行拦截,这些值都不以“http://”或者“https://”字符串作为开头;
server_names:“Referer”请求头包含某个虚拟主机名;
string ...:任意字符串定义一个服务器名或者可选的URI前缀,服务器名可以使用“*”开头或者结尾,当Nginx在检测请求头时,“Referer”请求头里的服务器端口将会被忽略掉;
正则表达式:必须以“~”符号作为开头。 需要注意的是表达式会从“http://”或者“https://”之后的文本开始匹配。
二、图片盗链配置
vim /etc/nginx/conf.d/default.conf
每次修改完配置文件,重启 Nginx 或者执行 nginx -s reload 才会生效,务必记得。
# location / {
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
root /usr/share/nginx/html;
index index.html index.htm;
valid_referers none blocked *.opsdrip.cn 192.168.5.154 server_names ~\.google\. ~\baidu\.;
if ($invalid_referer){
return ;
# rewrite ^/ http://opsdrip.cn/403.jpg;
}
}
在 location 节点里配置,截图如下:

下面以截图中的行数做个简单的说明:
第8行:location /
代表一个过滤器,/匹配所有请求,这里注释了
第9行:location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
其中“gif|jpg|jpeg|png|bmp|swf”设置防盗链文件类型,可自定义,每个后缀用“|”符号分开。
第13行:valid_referers none blocked *.opsdrip.cn 192.168.5.155 server_names ~\.google\. ~\baidu\.;
就是白名单,允许文件链出的域名或者IP地址白名单,所有来自opsdrip.cn、IP地址192.168.5.154和域名中包含google和baidu的站点都可以访问到当前站点的图片,如果来源域名不在这个列表中,那么$invalid_referer等于1,在 if 语句中返回一个403状态给用户,自行修改成自己的域名或者IP地址,域名(IP地址)与域名(IP地址)之间使用空格隔开。
第15行:return 403;
盗链返回一个403的状态码。
第16行:rewrite ^/ http://opsdrip.cn/403.jpg;
这个图片是盗链返回的图片,也就是替换盗链网站所有盗链的图片。这个图片要放在没有设置防盗链的网站上,因为防盗链的作用,这个图片如果也放在防盗链网站上就会被当作防盗链显示不出来,这里注释了,选择只返回一个403状态码。
在防盗链服务器的 /usr/share/nginx/html/ 目录下上传一张1.jpg的图片
在盗链服务器的 /usr/share/nginx/html/ 目录下新建一个html页面,代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>防盗链测试</title>
</head>
<body> <h1>Hello!</h1>
<img src="http://192.168.5.23/1.jpg"> <!-- 引入防盗链服务器上的图片 --> </body>
</html>
在浏览器访问html页面,如下:

修改防盗链服务器的配置,(将IP地址改为192.168.5.155):
# location / {
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
root /usr/share/nginx/html;
index index.html index.htm;
valid_referers none blocked *.opsdrip.cn 192.168.5.155 server_names ~\.google\. ~\baidu\.;
if ($invalid_referer){
return ;
# rewrite ^/ http://opsdrip.cn/403.jpg;
}
}
再次访问html页面,如下:

F12,查看,图片的状态为403

防盗链服务器Nginx日志中变量 $http_referer 也能够看到访问资源的链接是谁


这里做好防盗链之后其他网站盗链的本站图片就会全部失效无法显示,但是如果通过浏览器直接输入图片地址,仍然会显示图片,仍然可以右键另存为图片(因为它符合none这个规则,去掉参数“none”可以防止这种情况),甚至可以直接绕过防盗链的设置(比如在html页面的<head>里,加上这一句<meta name="referrer" content="never">,做一个伪签名,就可以轻松绕过防盗链)。
这样就不是彻底的防盗了!那么,Nginx应该怎么样彻底地实现真正意义上的防盗链呢?
修改Nginx的配置,把“none blocked”删掉,如下:
# location / {
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
root /usr/share/nginx/html;
index index.html index.htm;
valid_referers *.opsdrip.cn 192.168.5.154 server_names ~\.google\. ~\baidu\.;
if ($invalid_referer){
return ;
# rewrite ^/ http://opsdrip.cn/403.jpg;
}
}
浏览器再次访问盗链服务器上的html页面

直接访问防盗链服务器上的图片,也会显示403,如下:

图片使用请求头做防盗链,只能限制基本的图片盗用,无法防止图片采集。
本文参考自:
(1)https://www.jianshu.com/p/97937992e523
(2)https://blog.51cto.com/woymk/1893774
Nginx对图片进行防盗链的更多相关文章
- Nginx图片防盗链【实战】
访问我的博客 前言 博主目前在一家原创小说网站公司工作,由于站内的作品全部是原创,于是乎不可避免地会被一些盗版网站爬取盗版,对于防盗版一直没有很好的对策,让公司很是苦恼. 最近去一些盗版网站上搜索我们 ...
- Nginx中防盗链(下载防盗链和图片防盗链)操作记录
日常运维工作中,设置防盗链的需求会经常碰到,这也是优化网站的一个必要措施.今天在此介绍Nginx中设置下载防盗链和图片防盗链的操作~ 一.Nginx中下载防盗链的操作记录对于一些站点上的下载操作,有很 ...
- Nginx中防盗链(下载防盗链和图片防盗链)及图片访问地址操作记录
日常运维工作中,设置防盗链的需求会经常碰到,这也是优化网站的一个必要措施.今天在此介绍Nginx中设置下载防盗链和图片防盗链的操作~ 一.Nginx中下载防盗链的操作记录对于一些站点上的下载操作,有很 ...
- 完美的nginx图片防盗链设置详解
一般,我们做好防盗链之后其他网站盗链的本站图片就会全部失效无法显示,但是您如果通过浏览器直接输入图片地址,仍然会显示图片,仍然可以右键图片另存为下载文件!依然可以下载?这样就不是彻底的防盗链了! [r ...
- nginx 有关防盗链的设置
http://blog.csdn.net/longjef/article/details/53284108 关于nginx防盗链的方法网上有很多教程,都可以用,但是我发现很多教程并不完整,所做的防盗链 ...
- nginx作防盗链设置
盗链是一种损害原有网站合法权益,给原网站所在服务器造成额外负担的非法行为. 盗链的实现原理: 客户端向服务器请求资源时,为了减少网络带宽,提高响应时间,服务器一般不会一次将所有资源完整地传回给客户端. ...
- NGINX 如何防盗链
一.安装Nginx: 1.解决依赖关系 # yum groupinstall "Development Tools" "Server Platform Deveopmen ...
- Nginx下载防盗链(迅雷等下载软件)
什么是下载盗链 假设我们是一个B站,有些视频资源是可以提供给用户下载的.这时迅雷等其他下载软件,也提供下载该视频的服务, 但是迅雷很不厚道的,将我们的下载资源提供给他的用户,下载.占用我们的带宽来 ...
- nginx实现防盗链配置方法介绍
有些朋友觉得防盗链就是防止图片,其实有很多东西要进行防盗链了,下面我来介绍在nginx中实现防盗链配置方法有对图片防盗链与下载资源等. 防盗链配置 假设网站域名是 www.php100.com. 编辑 ...
随机推荐
- java大作业博客--购物车
Java 大作业----使用MySQL的购物车 一.团队介绍 姓名 任务 李天明.康友煌 GUI设计及代码编写 谢晓淞 业务代码编写.MySQL服务器平台部署.git代码库 严威 类和包的结构关系设计 ...
- [LeetCode] 874. Walking Robot Simulation 走路机器人仿真
A robot on an infinite grid starts at point (0, 0) and faces north. The robot can receive one of th ...
- Ubuntu16LTS使用笔记(Server版)
环境测试:Ubuntu Server 16.04.06 x64 虚拟机 以下均需要root权限,请sudo 或 su root 解决只有先启动Windows再重启到Linux才能使用usb网卡的问题: ...
- java编程思想之垃圾收集
1. finalize()用途何在?(一种常规用途的清除方法) 1)垃圾收集只跟内存有关.垃圾收集器存在的原因是为了回收程序不再使用的内存. 2)垃圾收集器会负责释放所有对象占据的内存,无论这些对象是 ...
- redis对象存储(适用于订单系统自动更新)
启动:redis-server.exe redis.windows.conf连接:redis-cli.exe -h 127.0.0.1 -p 6379 #插入取消的订单列表与时间: redis 127 ...
- Angular6 学习笔记——路由详解
angular6.x系列的学习笔记记录,仍在不断完善中,学习地址: https://www.angular.cn/guide/template-syntax http://www.ngfans.net ...
- 解决vue刷新页面以后丢失store的数据
刷新页面时vue实例重新加载,store就会被重置,可以把定义刷新前把store存入本地localStorage.sessionStorage.cookie中,localStorage是永久储存,重新 ...
- ng使用bootstrap
1.在项目中使用命令 npm i bootstrap -s来创建bootstrap 2.创建完成之后在 angular.json中引入进去 "styles": [ ...
- 适配器模式(Adapter Pattern)--设计模式
在生活中,想用苹果充电线给安卓的手机充电时,因为两者的接口不一样,会导致充电口无法进行匹配, 这时候,就需要适配器,将安卓的充电口转化为苹果的接口,这样就可以充电啦.已有的类与新的接口不兼容问题是很普 ...
- Redis(五)事务
Redis(五)事务 引用wiki中关于事务处理的定义: Transaction processing is information processing in computer science th ...