版权声明:本文为博主原创文章,未经博主允许不得转载。 https://cloud.tencent.com/developer/article/1333770
客户端向服务器请求资源时,
为了减少网络带宽,提高响应时间,服务器一般不会一次将所有资源完整地传回给客户端。
比如在请求一个网页时,首先会传回该网页的文本内容,
当客户端浏览器在解析文本的过程中发现有图片存在时,
会再次向服务器发起对该图片资源的请求,服务器将存储的图片资源再发送给客户端。
在这个过程中,
如果该服务器上只包含了网页的文本内容,
并没有存储相关的图片资源,而是将图片资源链接到其他站点的服务器上去了,
这就形成了盗链行为
http 标准协议中有专门的字段记录 referer
一来可以追溯上一个入站地址是什么
二来对于资源文件,可以跟踪到包含显示他的网页地址是什么
因此所有防盗链方法都是基于这个 Referer 字段
valid_referers none | blocked | server_names | string ....;
none 检测 Referer 头域不存在的请求
blocked 检测 Referer 头域的值被防火墙或者代理服务器删除或伪装的情况。
这种情况下,该头域的值不以 “http://” 或者 “https://” 开头
server_names 设置一个或多个 URL ,检测 Referer 头域的值是否是这些 URL 中的某个。
从 nginx 0.5.33 以后支持使用通配符 “*” 。
location ~* \.(gif|jpg|png|flv|swf|rar|zip|webp)$
{
valid_referers none blocked imuzxx.com *.imuzxx.com server_names ~\.google\. ~\.baidu\.;
if ($invalid_referer) {
return 403;
#rewrite ^/ http://www.baidu.com/403.jpg;
}
location /download {
accesskey on;
accesskey_hashmethod md5;
accesskey_arg "sign";
accesskey_signature "signtip$remote_addr";
}
- accesskey 为模块开关;
- accesskey\_hashmethod 为加密方式 MD5 或者 SHA-1;
- accesskey\_arg 为 url 中的关键字参数;
- accesskey\_signature 为加密值,此处为 mypass 和访问 IP 构成的字符串。
<?php
$sign= md5("signtip".$_SERVER['REMOTE_ADDR']);
$output_sign = "<a href=http://imuzxx.com/public/wozzxxLM.rar?sign="
.$sign.">download_add_key</a><br />";
$output_nosign="<a href=http://imuzxx.com/public/wozzxxLM.rar>download_org_path</a><br />";
echo $output_sign;
echo $output_nosign;
?>
http://imuzxx.com/download/hello.zip?sign=edsds2324sdf234