secure_link_module模块
1.定制并允许检查请求的链接的真实性以及保护资源免遭未经授权的访问。
2.限制链接生效周期
配置语法
语法:secure_link expresion;
默认:
作用域:http,server,location
语法:secure_link_md5 expression;
默认:
作用域:http,server,location
点击下载-》生成下载-》返还客户端-》校验下载链接-》成功或失败下载资源
/download?md5=xxxxxx&expires=1539792000 时间戳
编译选项开启 –with-http_secure_link_module
listen 9001;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
root /data/html/www;
location ~ /files/ {
secure_link $arg_md5,$arg_expires; #这里配置了2个参数一个是arg_md5,一个是arg_expires
secure_link_md5 "$secure_link_expires$uri secret_key"; #secret_key为自定义的加密串
if ($secure_link = "") {
return 403; #资源不存在或哈希比对失败
}
if ($secure_link = "0") {
return 403; #时间戳过期
}
if ($request_filename ~* ^.*?\.(jpg)$){
add_header Content-Disposition attachment; #不浏览,直接下载
}
}
#!/bin/bash
servername="124.207.55.82:9001" #服务器的域名
download_file="/files/nginx-1.14.0.tar.gz" #测试下载文件的uri
time_num=$(date -d "+300 seconds" +%s) #定义过期时间为300秒
secret_num="secret_key" #自定义的加密串,和nginx的配置文件中加密串相同
res=$(echo -n "${time_num}${download_file} ${secret_num}"|openssl md5 -binary|openssl base64|tr +/ -_|tr -d =) #生成MD5值
echo "http://${servername}${download_file}?md5=${res}&expires=${time_num}" #打印下载链接
用shell脚本生成出来的下载地址在nginx上会自动的进行校验,成功则会下载,不成功则不会下载
注意注意注意:系统时间和脚本时间是否一致
php生成的脚本
<?php
$secret = 'secret_key'; // secrets
$pathfile = "/files/nginx-1.14.0.tar.gz"; // ?f=path
$expire = 1533052800; //这里设置个固定时间和shell脚本对应测试代码的正确性
$md5 = base64_encode(md5($expire.$pathfile." ".$secret , true)); //使用二进制散列.
$md5 = strtr($md5, '+/', '-_'); // +和/或被认为是URL中的特殊字符,参见引用中链接的维基百科页面
$md5 = str_replace('=', '', $md5);
$url = "http://124.207.55.82:9001$pathfile?md5=$md5&expires=$expire"; //安全下载链接可以直接echo输出
echo $url;
$arr = array("url"=>$url, "expire"=>date("Y-m-d H:i:s", $expire), "md5"=>$md5);
echo json_encode($arr); //转成json格式输出也不错