nginx 通过 secure_link_md5 指令实现基于 md5 的一次性签名验证,用于静态资源防盗链与限时访问;需启用 ngx_http_secure_link_module 模块,配置 secure_link 与 secure_link_md5 配对使用,并严格保持服务端签名拼接顺序、编码方式一致。

在 Nginx 中启用 secure_link_md5 指令,可为静态资源(如图片、视频、下载包)添加基于 MD5 的一次性访问签名验证,实现简单有效的防盗链与限时访问控制。
启用 secure_link_md5 的前提条件
确保 Nginx 已开启 ngx_http_secure_link_module 模块(1.1.10+ 默认内置,无需额外编译)。可通过 nginx -V 2>&1 | grep -o with-http_secure_link_module 验证。该模块不依赖外部库,但要求配置中明确使用 secure_link 和 secure_link_md5 指令配对工作。
基础配置:生成与校验签名 URL
签名 URL 格式为:/path/to/file?st=BASE64_ENCODED_MD5&e=EXPIRE_TIMESTAMP。Nginx 会按约定方式拼接密钥、路径、过期时间后计算 MD5,并比对 st 参数。
- 在
location块中设置secure_link $arg_st,$arg_e;提取参数 - 用
secure_link_md5 "$secure_link_secret$uri$arg_e";生成期望的 MD5($secure_link_secret是自定义密钥,需与服务端签名逻辑一致) - 若校验失败或过期,
$secure_link变量值为空或 0;成功则为 1,可配合if转发或返回错误
典型 location 配置示例
以下配置限制 /download/ 下文件仅接受有效签名访问,过期自动拒访:
location /download/ {
secure_link $arg_st,$arg_e;
secure_link_md5 "my_secret_key$uri$arg_e";
<pre class="brush:php;toolbar:false;">if ($secure_link = "") {
return 403;
}
if ($secure_link = "0") {
return 410; # 过期
}
# 签名有效,正常提供文件
alias /var/www/static/;}
注意:$uri 不含 query string,因此签名时必须严格使用原始请求路径(如 /download/app-v2.3.zip),不能带参数;过期时间 $arg_e 应为 Unix 时间戳(秒级)。
服务端签名生成要点(以 Python 为例)
前端或后端生成签名时,需保证拼接顺序、编码方式与 Nginx 完全一致:
- 构造字符串:
my_secret_key + "/download/app-v2.3.zip" + str(expire_timestamp) - 计算 MD5 并 Base64 编码(URL 安全 Base64,去掉
=,替换+为-、/为_) - 最终 URL:
/download/app-v2.3.zip?st=abc123xyz&e=1735689600
签名密钥 my_secret_key 必须保密,且所有签发方与 Nginx 配置保持一致;建议定期轮换密钥并更新配置重载。











