使用Nginx做防盗链处理,可以用一些简单的方法来实现,代码如下:

#针对gif、jpg、jpeg、png、bmp、swf图片的防盗链处理

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {

     valid_referers none blocked *.ithov.com ithov.com;

     if ($invalid_referer) {

     #rewrite ^/ http://www.ithov.com/error.jpg;

     return 404;

      }

}

#针对wma、wmv、asf、mp3、mmf、zip、rar、iso、7z、msi、exe文件的防盗链处理

location ~ .*\.(wma|wmv|asf|mp3|mmf|zip|rar|iso|7z|msi|exe)$ {

     valid_referers none blocked *.ithov.com ithov.com;

     if ($invalid_referer) {

     #rewrite ^/ http://www.ithov.com/index.html;

     return 404;

      }

}

当然,现在的下载工具都是比较牛的,所以有些时候做简单的防盗链处理往往效果不能令人满意,哪么我们就必须结合Nginx的HttpAccessKeyModule模块,好了,且看下面文章中的详细介绍。

HttpAccessKeyModule模块下载地址:http://wiki.nginx.org/images/5/51/Nginx-accesskey-2.0.3.tar.gz

1.确认安装了gcc和make,如果没有就运行下面的命令

yum -y install gcc* make

2.解压nginx和nginx-accesskey,并编译nginx

tar zxf Nginx-accesskey-2.0.3.tar.gz && cd nginx-accesskey

修改conf文件里内容,如下图:

 点击查看原图

也就是把这行HTTP_MODULES="$HTTP_MODULES $HTTP_ACCESSKEY_MODULE"替换为HTTP_MODULES="$HTTP_MODULES ngx_http_accesskey_module"

点击查看原图

tar zxf nginx-1.0.9.tar.gz && cd nginx-1.0.9

 在原有的编译参数上增加

./configure --add-module=path/to/nginx-accesskey

然后执行:

make &&make install

service nginx restart

3.修改nginx配置文件

vi /etc/nginx/nginx.conf

nginx文件里内容:

点击查看原图

/download替换为你想要防盗链的目录.

访问测试脚本download.php:
<?
$ipkey= md5("mypass".$_SERVER['REMOTE_ADDR']);
$output_add_key="<a href=http://www.linuxidc.com/download/G3200507120520LM.rar?key=".$ipkey.">download_add_key</a><br />";
$output_org_url="<a href=http://www.linuxidc.com/download/G3200507120520LM.rar>download_org_path</a><br />";
echo $output_add_key;
echo $output_org_url;
?>
访问第一个download_add_key链接可以正常下载,第二个链接download_org_path会返回403 Forbidden错误。

他的运行方式是:如我的download 目录下有一个 file.zip 的文件。对应的URI 是http://www.linuxidc.com/download/file.zip
使用ngx_http_accesskey_module 模块后http://www.linuxidc.com/download/file.zip?key=09093abeac094. 只有给定的key值正确了,才能够下载download目录下的file.zip。而且 key 值是根据用户的IP有关的,这样就可以避免被盗链了。

 

4.nginx-accesskeyp使用cookie做key

 一般我们使用防盗链都是使用这样的配置:

location /download {

  accesskey             on;

  accesskey_hashmethod  md5;

  accesskey_arg         "key";

  accesskey_signature   "mypass$remote_addr";

}
其中:
accesskey为模块开关;
accesskey_hashmethod为加密方式MD5或者SHA-1;
accesskey_arg为url中的关键字参数;
accesskey_signature为加密值,此处为mypass和访问IP构成的字符串。

 对大部分的网站来说,一般程序和下载文件不会是在同一台服务器的,所以对于多出口的网络(如移动,铁通,或一个公司有多个出口做负载均衡的情况下),就 可能出现key对不上而发生403的问题,对于这个问题,只能选择换key了,不用$remote_addr那用什么呢?Cookie是个好尝试,于是上 面的配置可以改成:

if ( $http_cookie ~* " ng_cookie=(.+?)(?:;|$)")

{

    set $ng_cookie $1;

}

location /download {

  accesskey             on;

  accesskey_hashmethod  md5;

  accesskey_arg         "key";

  accesskey_signature   "mypass$ng_cookie";

}

测试过ie,firefox,获取cookie都OK,只要不清cookie,不跨域,对于同一个浏览器来说url都不会失效.

5.nginx-accesskey和proxy store结合试用

第三方模块跟nginx自带的模块总会发生一些冲突而导致某些功能失灵,当access key和proxy store同时使用的时候就会发生冲突而导致加密失败,但nginx总能用一些nginx特殊的方式去解决这个问题,比如可以通过404去请求proxy store,配置如下:

        proxy_buffering on;

        location / {

                root /home;

                accesskey             on;

                accesskey_hashmethod   md5;

                accesskey_arg         "key";

                accesskey_signature   "mypasswd$remote_addr";

                error_page 404 =200 /fetch$request_uri;

        }

        location /fetch/ {

                alias /home;

                proxy_store on;

                proxy_set_header Accept-Encoding '';

                proxy_set_header Host $host;

                proxy_pass http://10.0.0.2;

        }

用户请求到/,先通过access key判断是否有效,无效直接403,有效继续往下走,假如碰到404,就跳到/fetch/,从后端的服务器把文件抓过来.

好了,大家可以根据上面的一些配置来自己进行研究.