现在很多站长已经开始转向了VPS自建站,而在建站过程中,很多站长也比较倾向于Nginx作为WEB服务器使用,不过无论使用什么WEB软件,一般除国内、香港等几个地区外,几乎都有流量的限制,虽说VPS包含的流量大了,但是如果遇到有人将自己网站的图片等盗链到其他网站怎么办?
您难道愿意自己的流量白白的让给别人来使用么?很显然,没人原因!
当然,您可以选择我开发的“微博图床”将图片上传到微博中,您也可以选择七牛这样的云存储来降低您的流量,但是如果您都不想使用呢?很简单,如果您正在使用Nginx作为前端WEB服务器,那么跟着我操作,很快您就能配置一台能够抵御大多盗链的反盗链服务器了!
nginx accesskeynginx accesskey是nginx下的一个反盗链模块,使用此模块后,所保护的文件必须以?key=xxxx类似的方式来进行访问,否则会返回403无权限代码,使用此模块可以轻松的配置一个简单的反盗链服务器。
不过使用此模块也有一些缺陷,那就是?key=xxx是固定不变的,每幅图都是同样的链接,这样是否能够很好的达到反盗链的目的呢?恐怕不行,所以,我们应该再加上一层保护,使用secure link。
secure linksecure link也是nginx下的一个反盗链模块,使用此模块后,可以自定义要保护的文件所需要提供的请求参数,比如过期时间什么的,与nginx accesskey模块搭配可以很好的解决网站盗链难题。
编译、安装要配置防盗链,首先您需要下载相应的程序:
wget -c http://nginx.org/download/nginx-1.4.4.tar.gz
wget -c http://wiki.nginx.org/images/5/51/Nginx-accesskey-2.0.3.tar.gz
OK,下载完成后,首先将两个程序解压出来
tar zxvf nginx-1.4.4.tar.gz
tar zxvf Nginx-accesskey-2.0.3.tar.gz
然后我们进入nginx accesskey的目录修改以下配置文件
cd nginx-accesskey-2.0.3
vi config
将其中的
HTTP_MODULES="$HTTP_MODULES $HTTP_ACCESSKEY_MODULE"
修改为
HTTP_MODULES="$HTTP_MODULES ngx_http_accesskey_module"
然后返回进入到nginx目录
现在开始编译,编译参数按照自己的需求定义,不过需要增加两个参数
./configure --with-http_secure_link_module --add-module=../nginx-accesskey-2.0.3/
make && make install
nginx配置安装之后,我们进入nginx配置目录对站点配置文件进行配置,在server模块下增加
location /wp-content/uploads {
accesskey on; #开启nginx accesskey
accesskey_hashmethod md5; #验证方式为MD5验证
accesskey_arg "key"; #连接参数为key
accesskey_signature "shuang.ca$remote_addr"; #验证字符串为shuang.ca加上$remote_addr
secure_link $arg_st,$arg_e; #设置sercure link的接收参数为st与e,st参数为base64字符串,e为过期时间
secure_link_md5 "shuang.ca$arg_e"; #验证字符串为shuang.ca加上参数e
if ($secure_link = "") { #若secure link字符串获取失败则返回403代码
return 403;
}
if ($secure_link = "0") { #若secure link字符串获取失败则返回403代码
return 403;
}
}
这样就配置好了,我们所保护的是/wp-content/uploads目录下的所有文件,若需要保护全部图片文件等,将location /wp-content/uploads做相应修改就可以了,不过不建议全站保护,否则您所有要保护的文件类型链接都必须要加上验证参数,这个就太累了!
使用好了,我们已经配置好了,现在我站内的所有附件文件全部提示403了,那么现在要怎么使用呢?
这里以wordpress作为示例,首先编辑主题中的functions.php文件,在其中增加代码
// 附件防盗链
function shuangca_secure_media($content) {
preg_match_all('/<img .+src=['"]([^'"]+)['"].*/>/i', $content, $matches);
$key= md5("shuang.ca".$_SERVER['REMOTE_ADDR']);
$expire = time()+300; // 设置过期时间为300秒,超过时限则失效
$md5=str_replace( "=", "", strtr(base64_encode(md5("shuang.ca" . $expire, TRUE)), "+/", "-_")) . "n";
$content = str_replace( $matches[1][0], $matches[1][0] . '?token=' . $key . '&st=' . $md5 . '&e=' . $expire, $content);
return $content;
}
add_filter( 'the_content','shuangca_secure_media', 12 );
然后打开wp-includes下的media-template.php文件,找到
$class = 'media-modal wp-core-ui';
在下面增加
然后将所有的
<img src="{{ data.size.url }}"
修改为
<img src="http://shuang.ca/nginx-xia-de-zui-jia-fang-dao-lian-fang-shi/{{ data.size.url }}?key=<?php echo $key; ?/>&st=<?php echo $md5; ?>&e=<?php echo $expire; ?>"
现在再次测试,是不是已经成功了?而且还限制了过期时间,若是超过了时间再次访问就会自动失效,很不错吧?