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 = "https://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:这里时间戳不是实时获取,也没加超时时间。
原创文章,转载请注明。本文链接地址: https://www.rootop.org/pages/4660.html