关于使用nginx实现图片防盗链

什么是nginx

nginx中文文档

什么是Referer

Referer 首部包含了当前请求页面的来源页面的地址,即表示当前页面是通过此来源页面里的链接进入的。服务端一般使用 Referer 首部识别访问来源,可能会以此进行统计分析、日志记录以及缓存优化等。

通俗来说,假如我通过Google搜索去搜索referer,然后搜索引擎给出了一堆链接,这个时候,我点击链接,那么http头就会带上referer字段信息,并且值就是Google搜索的url地址https://www.google.com;因此,假设从A网址到B网址,那么这个referer字段就告诉B网址该请求是从A网址发起的。

nginx实现防盗链的原理

既然http头部会带有referer字段,因此,就可以从这个字段入手,我们只需要确认我们的referer白名单,就可以成功的实现防盗链功能,因此,就需要拦截你所想拦截的请求,然后,去读取每一个请求的referer字段信息,如果存在空值或者referer字段的值不在白名单中,就可以返回相应的http状态码(404,403d等等)

具体配置代码

摘抄自nginx中文文档

1
2
3
4
5
6
7
8
location ~* \.(gif|jpg|png|swf|flv)$ {  
root html
valid_referers none blocked *.nginxcn.com;
if ($invalid_referer) {
rewrite ^/ [www.nginx.cn](http://www.nginx.cn/)
#return 404;
}
}
  1. valid_referers就是所有请求通过拦截后根据referer白名单对比的结果

  2. none blocked就是指后面的域名、ip就是referer白名单的值

  3. *.nginxcn.com就是referer白名单

缺点

referer可伪造

像Java的httpclient,可以伪造一个referer去实现一个资源请求,然后顺利的下载资源,因此,通过referer所实现的防盗链接面对这样的操作,就是摆设。