Secure Link 模块是 Nginx 轻量级防盗链机制,通过 secure_link_secret 对 URI 路径与密钥做 MD5 哈希校验,仅支持旧版 Nginx(≤1.9.2),无时间戳、易被重放,新版应改用支持过期验证的 secure_link 指令。

Secure Link 模块是 Nginx 提供的轻量级防盗链机制,通过 secure_link_secret(已废弃,仅适用于旧版 Nginx ≤ 1.9.2)在 HTTP 层对 URL 进行简单哈希校验,实现资源访问控制。它不依赖外部服务、无需数据库或会话,适合静态资源(如图片、视频、下载包)的时效性保护。
理解 secure_link_secret 的工作原理
该指令基于一个共享密钥,对请求 URI 的路径部分做 MD5 哈希,生成 16 字节(32 位十六进制)签名。Nginx 将请求中的签名与本地计算值比对,一致才放行。
- 客户端需按约定格式构造 URL:
/path/to/file?md5=xxx,其中xxx是MD5("/path/to/file" + secret)的十六进制小写结果 - 服务端使用相同 secret 对请求路径(不含 query string)计算 MD5,与参数
md5值比对 - 匹配成功则变量
$secure_link为 1;失败或缺失则为 空 或 0 - 注意:不校验时间戳、不支持过期控制,纯静态签名 —— 安全性较弱,仅防直接盗链,不防重放或批量破解
配置示例(Nginx ≤ 1.9.2)
在 server 或 location 块中启用:
location /download/ {
secure_link_secret "my_secret_key";
if ($secure_link = "") {
return 403;
}
# 可选:重写为真实文件路径
alias /var/www/static/;
}例如,要访问 /download/report.pdf,客户端需先计算:
得到类似 8a7b3c2e9f1d0a4b5c6e7f8a9b0c1d2e,再拼接 URL:https://example.com/download/report.pdf?md5=8a7b3c2e9f1d0a4b5c6e7f8a9b0c1d2e
重要限制与替代建议
secure_link_secret 在 Nginx 1.10+ 中已被移除,官方推荐改用更安全的 secure_link 指令(支持 base64 编码、时间戳、过期验证)。
- 若你使用的是新版 Nginx,应弃用
secure_link_secret,改用如下模式:secure_link $arg_md5,$arg_expires;+secure_link_md5 "xxx$secure_link_expires$uri"; - 旧版环境若无法升级,务必避免将 secret 硬编码在前端 JS 或日志中,且定期轮换 secret
- 该机制无法阻止抓包后重复使用有效链接,建议配合 Referer 白名单、IP 限速或 CDN 签名作为补充
调试技巧
开启 Nginx 错误日志(error_log /var/log/nginx/error.log debug;)可查看 secure_link 计算过程;也可临时添加响应头辅助排查:
add_header X-Secure-Link "$secure_link"; add_header X-Computed-MD5 "$secure_link_md5";
注意:上线前务必关闭 debug 日志与敏感头信息,防止密钥泄露。

















