模块名称:ngx_http_secure_link_module
ngx_http_secure_link_module
模块(Nginx 0.7.18开始
)用于检查请求链接的真实性,保护资源免遭未经授权的访问,并限制链接寿命。常用于访问及文件下载的防盗链的实现。
该模块不是默认构建的,需要通过 --with-http_secure_link_module
配置参数来启用。
该模块功能的实现原理如下:
HTTP
应用程序计算出唯一的MD5
字符串和过期时间。HTTP
应用程序把计算出的MD5
字符串和过期时间以参数的形式与被限制的真实连接组成新的访问连接。MD5
字符串和过期时间参数的连接后,请求Nginx
服务器。Nginx
通过secure_link
指令获取用户访问连接中的MD5
字符串和过期时间的值。Nginx
校验过期时间是否过期,当被判断为过期时,设置模块内置参数$secure_link
的值为0。Nginx
把MD5
字符串与secure_link_md5
指令指定格式生成的MD5
值进行比对,在过期时间内,当MD5
被判断为一致时,设置模块内置参数$secure_link
的值为1。$secure_link
的值默认为空。Nginx
配饰示例如下:
server {
...
location /download {
secure_link $arg_secret_valid,$arg_secret_time;
secure_link_md5 trumanwong$uri$arg_secret_time;
if ($secure_link = "") {
return 403;
}
if ($secure_link = "0") {
return 405;
}
...
}
...
}
PHP
配置示例如下:
<?php
// 密钥
$secret = 'trumanwong';
// 被保护的真实连接
$path = "/download/example.zip";
// 访问超时时间
$expire = time() + 10;
// 将访问密钥、访问路径、超时时间加密
$md5 = base64_encode(md5($secret . $path . $expire, true));
// 特殊字符“+”和“/”的处理
$md5 = strtr($md5, '+/', '-_');
// 特殊字符“=”的处理
$md5 = str_replace('=', '', $md5);
// 新的访问连接
$url = "https://trumanwl.com{$path}?secret_valid={$md5}&secret_time={$expire}";
echo '<a href="' . $url . '">example.zip</a>';
?>