防盗链
防盗链的原理
HTTP协议的请求头中存在一个Referer域,该域采用URL的格式表示访问当前网页或者文件的源地址。
通过Referer域的值,我们可以检测到访问目标资源的源地址。这样,如果我们检测到Referer头域中的值并不是自己站点内的URL,就采取阻止措施,实现防盗链。
valid_referers指令
Nginx配置中有一个valid_referers指令,用来获取Referer头域中的值,并且根据该值的情况给Nginx全局变量$invalid_referer赋值。
如果Referer头域中没有符合valid_referers指令配置的值,$invalid_referer变量将会被赋值为1。
valid_referers指令的语法结构为:
none,检测Referer头域不存在的情况。
blocked,检测Referer头域的值被防火墙或者代理服务器删除或伪装的情况。这种情况下,该头域的值不以“http://”或者“https://”开头。
server_names,设置一个或多个URL,检测Referer头域的值是否是这些URL中的某个。从Nginx 0.5.33以后支持使用通配符“*”。
防盗链的实现
有了valid_referers指令和$invalid_referer变量,就能通过Rewrite功能来实现防盗链。有两种实现方案:一种是根据请求资源的资源类型,一种是根据请求目录。
根据请求资源的资源类型
在上述配置中,当有网络连接对以gif、jpg、png为后缀的图片资源、以swf、flv为后缀的媒体资源、以rar、zip为后缀的压缩存档资源发起请求时,如果检测到Referer头域中没有符合valid_referers指令配置的值,就将客户端请求的URL重写为http://www.myweb.com/images/forbidden.png,这防止了非法盗链行为。
当然我们也可以不重写URL,直接返回HTTP错误状态,如403状态。
根据请求目录
其原理和根据文件类型实现防盗链的原理是一样的,只是在location块的uri变量上做了改变,对于请求服务器上[root]/server/file/目录下的资源采取了防盗链措施。
Last updated
Was this helpful?