有时候在浏览网页的时候,会遇到某些文件(图片等)没法访问的状况,这是由于图片的全部方作了防盗链机制html
了解防盗链以前先了解下http referer这个属性,http referer是请求头中的一部分,当浏览器向web服务器发出请求时,通常会带上这个属性用来代表网页的来源,好比我在qq空间里添加朋友的空间连接,那么当有人点击我空间里的这个连接调到朋友的qq空间时,referer的值就是我空间的url。nginx
防盗链的基本原理就是根据请求头中referer属性获得网页来源,从而实现访问控制。web
为何要实现防盗链?首先这些非法访问并不会给网站带来利益或好处,相反,这会浪费网站的带宽,增长服务器的链接压力,好比有些网站是按流量收费的,那么只要有人访问了盗用图片或其余文件的网站,网站就要支付这部分的流量费用。浏览器
如下是在nginx的实现方式:服务器
1 基本方式(ngx_http_referer_module模块)网站
第一行:定义了当访问资源为gif/jpg/png/bmp文件加密
第二行:valid_referers这个关键字定义了白名单lua
第三行:invalid_referer是内置变量,经过判断上一行中的valid_referers值会返回0或者1,url
none表明请求头中没有referer信息,这通常是直接在浏览器输入图片网址htm
blocked表明被防火墙过滤标记过的请求
第四行:若是访问来源不在白名单内,则返回403错误
第五行:能够经过设定指定的图片来代替目标图片
这种实现能够限制大多数普通的非法请求,但不能限制有目的的请求,由于这种方式能够经过伪造referer信息来绕过
2 使用http_accesskey_module模块或lua脚本实现
原理以下:不经过referer信息判断,经过约定url后的参数key的值(加密)来判断是不是合法来源。