nginx 可通过 secure_link 和 secure_link_md5 指令实现带签名、有时效的加密防盗链,无需 referer 校验;需确认模块已启用,配置 location 提取并校验 md5/expires 参数,服务端签名原文须与后端生成逻辑严格一致(含 $uri、$arg_expires、$remote_addr 和密钥),校验失败返回 403 或 410,通过后 alias 映射文件路径。

直接用 secure_link 和 secure_link_md5 指令就能实现带签名、有时效的加密防盗链,核心是让 URL 自带可验证的一次性凭证,不依赖 Referer 头,防伪造能力强。
确认模块已启用并检查基础支持
Nginx 多数发行版(如 Ubuntu 的 nginx-full、CentOS 的 nginx-mod-http-secure-link)默认编译了该模块。运行以下命令验证:
-
nginx -V 2>&1 | grep -o with-http_secure_link_module—— 有输出即支持 - 若无输出,需重新编译 Nginx 并添加
--with-http_secure_link_module - 注意:这不是独立插件,无需额外安装 Lua 或第三方模块
配置 location 实现签名校验
在匹配下载路径的 location 块中写入校验逻辑,例如保护 /dl/ 下所有文件:
- 用
secure_link $arg_md5,$arg_expires;提取 URL 中的md5和expires参数 - 用
secure_link_md5 "$uri$arg_expires$remote_addr your_secret_key";定义服务端签名原文(顺序必须与后端生成时完全一致) -
$uri包含前导斜杠(如/dl/file.zip),$remote_addr可绑定客户端 IP,增强安全性 -
$secure_link变量值为""表示参数缺失或格式错误;为"0"表示签名不匹配或已过期;为"1"表示合法且未过期
响应控制与文件映射
根据校验结果决定是否放行请求:
-
if ($secure_link = "") { return 403; }—— 缺少参数或解析失败 -
if ($secure_link = "0") { return 410; }—— 签名错误或链接已过期(410 更语义化) - 校验通过后,用
alias /var/www/downloads/;映射真实文件路径,注意路径结尾不带斜杠 - 可加
add_header Content-Disposition "attachment; filename=$arg_f";控制下载文件名(需前端传f参数)
生成安全链接的关键规则
后端生成 URL 时必须严格遵循 Nginx 配置中的拼接逻辑:
- 链接形如:
https://example.com/dl/app.tar.gz?md5=abc123&expires=1753123456 -
expires是秒级 Unix 时间戳(如time() + 3600表示 1 小时后失效) -
md5是对"/dl/app.tar.gz" + "1753123456" + "192.168.1.100" + "your_secret_key"做 MD5 得到的小写 32 位字符串(IP 部分需与 Nginx 中$remote_addr一致) - 密钥建议定期轮换,绝不硬编码在前端或日志中











