本文的方法主要有两种情况,利用Nginx自带的模块和第三方模块ngx_http_accesskey_module,相对于前者来说后者的效果更强,深度防盗比较不错。
一、一般的防盗链如下:
location ~* \.(gif|jpg|png|swf|flv)$
{
valid_referers none blocked www.xsdou.com xsdou.com;
if ($invalid_referer)
{
rewrite ^/ http://db.ci/404.html;
#return 403;
}
}
第一行:gif|jpg|png|swf|flv
表示对gif、jpg、png、swf、flv后缀的文件实行防盗链
第二行: 表示对www.xsdou.com这2个来路进行判断
if{}里面内容的意思是,如果来路不是指定来路就跳转到指定页面,当然直接返回403也是可以的。
二、针对图片目录防止盗链:
location /images/
{
alias /data/images/;
valid_referers none blocked server_names *.xsdou.com xsdou.com;
if ($invalid_referer) {return 403;}
}
三、使用第三方模块ngx_http_accesskey_module实现Nginx防盗链
首先下载Nginx-accesskey模块:http://wiki.nginx.org/images/5/51/Nginx-accesskey-2.0.3.tar.gz
tar -zxvf nginx-accesskey-2.0.3.tar.gz
比如说这时候文件解压到/usr/src/nginx-accesskey-2.0.3
修改其目录下的config文件
cd /usr/src/nginx-accesskey-2.0.3
vi ./config
将
$HTTP_ACCESSKEY_MODULE
替换成
ngx_http_accesskey_module
修改后的config文件如下:
USE_MD5=YES
USE_SHA1=YES
ngx_addon_name=ngx_http_accesskey_module
HTTP_MODULES="$HTTP_MODULES ngx_http_accesskey_module"
NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_accesskey_module.c"
杀死nginx进程
kill `cat /usr/local/nginx/nginx.pid`
来到nginx的源代码目录下面 /usr/src/nginx-0.7.54,重新编译nginx
cd /usr/src/nginx-0.7.54/
./configure -add-module=/usr/src/nginx-accesskey-2.0.3
(注意:其他nginx编译参数请按照自己的需要添加,这里省略未写)
make && make install
配置nginx.conf
vi /usr/local/nginx/conf/nginx.conf
在你需要设置防盗链的主机的下面加入以下内容,比如主机根目录下面download目录下面的文件都要防盗链,那么就加入:
location /download
{
accesskey on;
accesskey_hashmethod md5;
accesskey_arg "key";
accesskey_signature "password$remote_addr";
}
注意:这里accesskey_signature后面的password是干扰码,你可以改为自己需要的密码。
设置完毕,重启nginx
#ulimit -SHn 51200
#/usr/local/nginx/sbin/nginx
至此,accesskey模块安装完毕。
二、如何使用防盗链功能
按照以上的设置,download文件夹下所有的文章如果用地址直接引用,比如http://db.ci/download/test.rar,都会提示403错误,无法访问到资源,这也就是我们说的防盗链功能已经生效。那么要如何才能让我们的目标用户下载这些文件呢?方法就是我们要给用户一个正确的链接,形如http://www.xinkexue.com/download/test.rar?key=3b5423523952352bg2g
这个key后面的参数是根据前面设定的accesskey_hashmethod和accesskey_signature确定的,比如我们前面的设定就是对password$remote_addr($remote_addr代表客户端传递过来的IP)的值进行MD5加密运算得到的结果。我们要把带有 key值的地址重新定向给目标用户,这样我们的目标用户才能下载到资源,没有key或者key值错误,都将被认为是盗链,而无法下载。
下面我们用PHP脚本的header重定向函数举例说明:
//其他代码省略
//header函数实现重定向
header("location:http://www.xinkexue.com/download/test.rar?key=".md5("password".$_SERVER['REMOTE_ADDR']));
这样用户就能顺利访问到含有正确key值的资源了。
或者