Nginx实现图片防盗链功能
- 1853
- Linux
- 0
- super_dodo
- 2020/10/21
很多时候在浏览网页的时候,尤其是图片来自QQ空间之类的,会遇到某些文件(图片等)无法访问的情况,这是因为图片的所有方做了防盗链机制
了解防盗链之前先了解下http referer这个属性,http referer是请求头中的一部分,当浏览器向web服务器发出请求时,一般会带上这个属性用来表明网页的来源,比如我在qq空间里添加朋友的空间链接,那么当有人点击我空间里的这个链接调到朋友的qq空间时,referer的值就是我空间的url。
防盗链的基本原理就是根据请求头中referer属性得到网页来源,从而实现访问控制。
为什么要实现防盗链?首先这些非法访问并不会给网站带来利益或好处,相反,这会浪费网站的带宽,增加服务器的连接压力,比如有些网站是按流量收费的,那么只要有人访问了盗用图片或其他文件的网站,网站就要支付这部分的流量费用。
以下是在nginx的实现方式:
1 基本方式(ngx_http_referer_module模块)
编辑Nginx配置文件 vim www.dodobook.net.conf location ~* .(gif|jpg|png|jpeg)$ { valid_referers none blocked www.dodobook.net www.dodobook.me;# 原是站点访问的是www.dodobook.me时,不做禁止 if ($invalid_referer){ # return 403; rewrite ^/ http://www.dodobook.cc/assets/img/logo.png; } } 重启Nginx systemctl restart nginx.service 第一行:定义了当访问资源为gif/jpg/png/bmp文件 第二行:valid_referers这个关键字定义了白名单 第三行:invalid_referer是内置变量,通过判断上一行中的valid_referers值会返回0或者1, none代表请求头中没有referer信息,这一般是直接在浏览器输入图片网址 blocked代表被防火墙过滤标记过的请求 第四行:如果访问来源不在白名单内,则返回403错误 第五行:可以通过设定指定的图片来代替目标图片
这种实现可以限制大多数普通的非法请求,但不能限制有目的的请求,因为这种方式可以通过伪造referer信息来绕过
2 使用http_accesskey_module模块或lua脚本实现
原理如下:不通过referer信息判断,通过约定url后的参数key的值(加密)来判断是否是合法来源。
相关阅读
- 通过Google API客户端访问Google Play帐户报告PHP库
- PHP执行文件的压缩和解压缩方法
- 消息中间件MQ与RabbitMQ面试题
- 如何搭建一个拖垮公司的技术架构?
- Yii2中ElasticSearch的使用示例
热门文章
- 通过Google API客户端访问Google Play帐户报告PHP库
- PHP执行文件的压缩和解压缩方法
- 消息中间件MQ与RabbitMQ面试题
- 如何搭建一个拖垮公司的技术架构?
- Yii2中ElasticSearch的使用示例
最新文章
- 通过Google API客户端访问Google Play帐户报告PHP库
- PHP执行文件的压缩和解压缩方法
- 消息中间件MQ与RabbitMQ面试题
- 如何搭建一个拖垮公司的技术架构?
- Yii2中ElasticSearch的使用示例