web防盗链是老生常谈的话题了,防盗链在特定环境下能有效的减轻服务器的压力,nginx给我们提供了很好的防盗链机制,我们只需要配置即可
防盗链两种方式:referers,加密签名
区别:前者根据nginx自行判断的请求来路(referer)的地址为非法的还是合法的,但是此种方法如果有心的人通过模拟referer进行访问的话还是没有办法,只能提高访问的门槛。后者需要配置一些参数加上自己的编上的算法进行访问,更加安全,但是对于程序人员来说就更加繁琐,每次访问的时候需要加上参数。
第一种配置问题:nginx.conf,找到server
在location ~.*\.(gif|jpg|jpeg|png|bmp|swf)${
valid_referers none blocked *.xxxx.com( 允许访问的域名)
if($invalid_referer){
return 403 或者 rewrite http://www.baidu.com
}
}
以上所有来至xxxx.com和域名中包含google和baidu的站点都可以访问到当前站点的图片,如果来源域名不在这个列表中,那么$invalid_referer等于1,在if语句中返回一个403给用户,这样用户便会看到一个403的页面,如果使用下面的rewrite,那么盗链的图片都会显示403.jpg。如果用户直接在浏览器输入你的图片地址,那么图片显示正常,因为它符合none这个规则.
语法: valid_referers none | blocked | server_names | string ...;
参数说明
none
“Referer” 来源头部为空的情况
blocked
“Referer”来源头部不为空,但是里面的值被代理或者防火墙删除了,这些值都不以http://或者https://开头.
server_names
“Referer”来源头部包含当前的server_names(当前域名)
arbitrary string
任意字符串,定义服务器名或者可选的URI前缀.主机名可以使用*开头或者结尾,在检测来源头部这个过程中,来源域名中的主机端口将会被忽略掉
签名加密:需要第三方模块:httpAccessKeyModule
检验 nginx -V :查看是否安装
在location ~.*\.(gif|jpg|jpeg|png|bmp|swf)${
accesskey on/off
accesskey_hashmethod md5 //加密规则(md5/sha1)
accesskey_arg sign//参数名
accesskey_signature “admin$remote_addr”//加密规则
}
在php端:
$sign=md5( 'admin' .$_server['REMOTE_ADDR']);
<img src='图片路径?sign={$sign}'>