Rootop 服务器运维与web架构

nginx下载防盗链模块之ngx_http_secure_link_module安全下载

nginx模块之ngx_http_secure_link_module安全下载

此模块可以对下载链接,比如/download/nginx.tar.gz 进行身份认证,一般用于只允许站内用户下载,节省带宽。
当在页面中用户点击”下载”按钮或者点击下载链接时,链接中带着身份认证及失效时间参数。
请求进入nginx后,nginx会使用secure_link模块对认证信息及失效时间进行校验后进行下载操作或者拒绝。

参考官方文档:http://nginx.org/en/docs/http/ngx_http_secure_link_module.html

server
{
	listen 80;
	server_name localhost server_default;
	root /usr/local/nginx/html;

	location /download/
	{
		secure_link $arg_md5,$arg_expires;
		secure_link_md5 "111111$uri$secure_link_expires";

		if ($secure_link = "")
		{
			return 401; # 这里返回401状态码,跟basic auth 一样
		}

		if ($secure_link = "0")
		{
			return 410; # 返回资源被删除状态码
		}
	}
}

nginx配置参数解释:

secure_link 从请求uri中获取指定的参数,下面两个即为获取的参数。
$arg_md5 #代表从nginx内置变量 $arg_PARAMETER (GET方法中) 获取参数值,比如 /index.php?md5=xxx,则$arg_md5等于xxx
$arg_expires # 同上

secure_link_md5 根据自定义密码+请求的uri+过期时间的时间戳 算出md5值
将此值与请求中的md5参数对比是否一致,如果不一致,则 $secure_link 变量为空字符串
如果两个值一致,则检查过期时间,如果过期了,则 $secure_link 变量为0,否则为1。

php参考生成下载链接:

<?php
// 自定义密码,跟nginx里一致
$secret = "111111";
// 文件uri
$uri = "/download/nginx.tar.gz";
// 失效时间,这里为300秒,可以设置一天。
$expire = time() + 300;
$md5 = md5($secret.$uri.$expire,true);
$md5 = base64_encode($md5);
// 把+替换为-,把/替换为_
$md5 = strtr($md5, '+/', '-_');
// 把=替换为空
$md5 = str_replace('=', '', $md5);
$url = "http://www.rootop.org:10000/download/nginx.tar.gz?md5={$md5}&expires={$expire}";
echo $url;

然后用此$url去访问。

shell生成下载链接:

root@rootop:~# echo -n '111111/download/nginx.tar.gz1577360554' | openssl md5 -binary | openssl base64 | tr +/ -_ | tr -d =

ps:这里时间戳不是实时获取,也没加超时时间。

原创文章,转载请注明。本文链接地址: http://www.rootop.org/pages/4660.html

赞赏

微信赞赏支付宝赞赏

作者:Venus

专注于 服务器运维与web架构 E-mail:venus#rootop.org

评论已关闭。