这里需要使用两台Linux主机(一台充当防盗链服务器,一台充当盗链服务器),下表是它们所使用的操作系统以及IP地址。
两台Linux主机所使用的操作系统以及IP地址 |
|
操作系统 | IP地址 |
CentOS7.5 | 192.168.5.136 |
CentOS7.5 | 192.168.5.65 |
两台Linux主机的Nginx都是yum安装,版本都是1.16.1
nginx referer指令简介
nginx模块ngx_http_referer_module通常用于阻挡来源非法的域名请求。我们应该牢记,伪装Referer头部是非常简单的事情,所以这个模块只能用于阻止大部分非法请求。我们应该记住,有些合法的请求是不会带referer来源头部的,所以有时候不要拒绝来源头部(referer)为空的请求。
图片盗链配置
vim /etc/nginx/conf.d/default.conf
以上所有来至opsdrip.cn、IP地址192.168.5.154和域名中包含google和baidu的站点都可以访问到当前站点的图片,如果来源域名不在这个列表中,那么$invalid_referer等于1,在if语句中返回一个403给用户,这样用户便会看到一个403的页面,如果使用下面的rewrite,那么盗链的图片都会显示403.jpg。如果用户直接在浏览器输入你的图片地址,那么图片显示正常,因为它符合none这个规则。
nginx http_refer防盗链配置语法
语法:valid_referers none | blocked | server_names | string ...;
默认值:-
配置段:server,location # 可以配置在server标签和location标签下
参数说明
none
“Referer” 来源头部为空的情况
blocked
“Referer”来源头部不为空,但是里面的值被代理或者防火墙删除了,这些值都不以http://或者https://开头
server_names
“Referer”来源头部包含当前的server_names(当前域名)
arbitrary string
任意字符串,定义服务器名或者可选的URI前缀,主机名可以使用 * 开头或者结尾,在检测来源头部这个过程中,来源域名中的主机端口将会被忽略掉
regular expression
正则表达式,~表示排除https://或http://开头的字符串.
最后
图片使用来源头部做防盗链是最合理的. 简单、实用。但是没有办法防止图片采集。
这里
一般,我们做好防盗链之后其他网站盗链的本站图片就会全部失效无法显示,但是您如果通过浏览器直接输入图片地址,仍然会显示图片,仍然可以右键图片另存为下载文件,甚至可以直接绕过防盗链的设置。(比如在<head>里,加上这一句<meta name="referrer" content="never">,做一个伪签名,可以绕过防盗链)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="referrer" content="never"> <title>防盗链测试</title> </head> <body> <h1>Hello!</h1> <img src="http://192.168.5.23/1.jpg"> </body> </html>
依然可以下载?这样就不是彻底的防盗了!那么,Nginx应该怎么样彻底地实现真正意义上的防盗链呢?