使用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/p_w_picpaths/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/,从后端的服务器把文件抓过来.
好了,大家可以根据上面的一些配置来自己进行研究.
转载于:https://blog.51cto.com/kusorz/1770224