nginx secure_link模块通过哈希签名实现时效性防盗链,核心是路径+过期时间+密钥拼接后md5签名,服务端验证签名与时效性;需启用模块、配置secure_link_md5指令、生成含md5和expires参数的url,并在location中校验$secure_link值放行请求。

利用 Nginx 的 secure_link 模块生成带有时效性的防盗链下载链接,核心在于:对资源路径 + 过期时间 + 密钥做哈希签名,Nginx 在请求时验证签名有效性与时效性。它不依赖 Referer 检查,而是基于加密签名实现更可靠的访问控制。
配置 secure_link 模块基础支持
确保 Nginx 编译时已启用 ngx_http_secure_link_module(主流发行版默认内置)。在 server 或 location 块中启用:
- 用
secure_link $arg_md5,$arg_expires;提取 URL 中的签名(md5)和过期时间(expires)参数 - 用
secure_link_secret your_secret_key;设置服务端密钥(注意:该指令仅适用于旧版语法;新版推荐用secure_link_md5配合变量) - 更推荐使用新版写法:
secure_link_md5 "$uri$secure_link_expires$secret_key";,配合自定义变量灵活控制签名源
生成合法的加密下载链接
链接需包含三要素:原始文件路径、过期时间戳(Unix 时间)、MD5 签名。生成逻辑如下(以 Python 为例):
- 设文件路径为
/files/report.pdf,有效期 300 秒,则expires = int(time.time()) + 300 - 拼接待签名字符串:
/files/report.pdf1718234567your_secret_key(注意无分隔符、顺序固定) - 计算 MD5 值(小写 32 位),取前 16 字节(32 字符)作为签名
- 最终链接形如:
https://example.com/files/report.pdf?md5=abc123...&expires=1718234567
Nginx 中验证并放行请求
在提供文件的 location 块中添加校验逻辑:
- 若
$secure_link为空,说明签名缺失或格式错误,返回 403 - 若
$secure_link = "0",表示签名无效(哈希不匹配)或已过期,返回 403 - 若
$secure_link = "1",表示验证通过,可正常提供文件(如用alias或root定位真实路径) - 建议搭配
add_header X-Secure-Link-Status $secure_link;方便调试
增强安全性与实用细节
单纯依赖 secure_link 可能存在风险,建议组合优化:
- 将真实文件存放在
location不对外暴露的路径下(如/data/private/),避免直接访问 - 签名中加入用户唯一标识(如 UID)或 IP 哈希,防止链接被他人复用
- 避免在日志中记录完整签名参数(可通过
log_format过滤$args中的md5和expires) - 注意时钟同步:Nginx 服务器时间必须准确,否则过期判断失效











