referer 模块
该模块可以进行防盗链设置。
概述
对于图片来说,A网站,如果想使用B网站的图片,可以直接写上B网站图片的链接地址,或者将B网站的图片通过右键另存为的方式下载到本地,然后在页面上使用。如果B网站不想A网站这么干了,那么B网站可以采取防盗链的措施来干这个工作,结果就是,A网站想请求所需要的资源,通过url的方式,获取的可能不是原来的图片了,出现404或者别的图片替代了。如果通过浏览器直接打开图片url,那么仍然有可能显示404,这就是防盗链。
语法
该指令"valid_referers"的语法:
valid_referers [none|blocked|server_names] ...
默认值:none
使用环境:server,location
该指令会根据Referer Header头的内容分配一个值为0或1给变量$invalid_referer。如果Referer Header头不符合valid_referers指令设置的有效,变量$invalid_referer将被设置为1.
该指令的参数可以为下面的内容
valid_referers 表示合法的referers设置
none: 表示无Referer值的情况,直接通过浏览器或者其他工具访问。
blocked: 表示有referers,但是值被代理服务器或者防火墙隐藏;
server_names:表示一个或多个主机名称。从Nginx 0.5.33版本开始,server_names中可以使用通配符"*"号。lutixia.net: 表示通过lutixia.net访问的referers,*.jfedu.net: 表示通过*.jfedu.net访问的referers,*表示任意host主机。
再说的通俗一点
valid_referers 定资源访问是通过以下几种方式为合法,即白名单
none: 允许缺失的头部访问
blocked: 允许referer没有对应值的请求
server_names:表示一个或多个主机名称。从Nginx 0.5.33版本开始,server_names中可以使用通配符"*"号。lutixia.net: 表示通过lutixia.net访问的referers,*.jfedu.net: 表示通过*.jfedu.net访问的referers,*表示任意host主机。
HTTP Referer
HTTP Referer是Header的一部分,当浏览器向Web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器借此可以获得一些信息用于处理,例如防止未经允许的网站盗链图片、文件等。因此HTTP Referer头信息是可以通过程序来伪装生成的,所以通过Referer信息防盗链并非100%可靠,但是,它能够限制大部分的盗链情况。
Referer到底是什么东西?我的nginx配置文件很简单,打开autoindex功能,即将整个目录列出来。然后将默认的index.html文件修改为index.html.bak,同时在目录下面创建一个jfedu.html文件
location / {
autoindex on;
root html;
index index.html index.htm;
}
来到主页,可以看到将文件目录全部列出来,我们要通过jfedu.html这个文件来做测试
下面图片的方式是通过在网页内通过鼠标点击jfedu.htm来访问该资源,可以看到是有Reference的值的,当前的reference信息就是当前网页的信息。可以看出从当前网页内访问的资源的Reference是有值的,即当前网页的信息。
下面这张图片是通过在网址栏输入资源地址直接访问的,不是通过鼠标在网站内点击访问,可以看到Reference的值是不存在的。直接输入链接标准的IP+资源是不存在Reference的值的。(匹配到的none)
防盗链案例一则
这是一个正则匹配,如果是以.gif,jpg,png,swf,flv结尾的文件,就匹配这个location规则,这些规则定义就是两个花括号里面的内容。
location ~* \.(gif|jpg|png|swf|flv)$ {
valid_referers none blocked lutixia.net *.jfedu.net;
root /usr/share/nginx/html;
if ($invalid_referer) {
return 403;
} }
location ~* \.(gif|jpg|png|swf|flv)${}为设置防盗链的文件类型,使用竖线|分隔。~*表示忽略大小写,只要是访问以.gif jpg png swf flv结尾的请求就匹配花括号里面的规则
valid_referers lutixia.net *.jfedu.net;为白名单,使用空格分隔,可以使用*进行泛域名设置。
if ($invalid_referer) {}为判断是否符合白名单,不符合白名单将执行{}内的内容。
总结就是:以上所有来自lutixia.net *.jfedu.net的站点都可以访问到当前站点的图片,如果来源域名不在这个列表中,那么$invalid_referer等于1,在if语句中返回一个403给用户,这样用户便会看到一个403的页面。
测试192.168.179.179.100去盗用192.168.179.99的图片
(1)在192.168.179.100上配置下面信息去盗用192.168.179.99的图片jfedu.png
[root@localhost nginx-1.16.1]# vim /usr/local/nginx/html/jfedu.html
[root@localhost nginx-1.16.1]# cat /usr/local/nginx/html/jfedu.html
this is 192.168.179.100
<image src="http://192.168.179.99/jfedu.png">
(2)192.168.179.99提供图片给100去盗取
[root@www nginx-1.16.1]# cp /usr/share/httpd/icons/icon.sheet.png /usr/local/nginx/html/jfedu.png
可以看到没加上防盗链规则192.168.179.100可以去盗用192.168.179.99的图片
[root@www nginx-1.16.1]# vim /usr/local/nginx/conf/nginx.conf --加上防盗链规则,注意要把自己的IP加上
location ~* \.(gif|jpg|png|swf|flv)$ {
valid_referers none blocked 192.168.179.99 lutixia.net *.jfedu.net;
root /usr/local/nginx/html;
if ($invalid_referer) {
return 403;
} }
[root@www ~]# /usr/local/nginx/sbin/nginx -s reload --重启服务
可以看到加上防盗链规则之后盗取失败了,返回403状态码
再来看看192.168.179.99的日志信息,可以看到请求的资源是jfedu.png,但是referrer并不是本机,这是一个盗链。