nginx 的 secure_link 模块通过 url 签名与时间戳校验实现高安全防盗链,需编译启用,支持绑定 ip 防共享,并依 $secure_link 值返回 403 或 410 错误。

直接启用并配置 secure_link 模块是 Nginx 实现高安全级别防盗链最可靠的方式。它不依赖客户端请求头,而是通过 URL 中携带签名和时间戳,由 Nginx 服务端实时校验,防伪造、有时效、可绑定 IP,适合保护图片、视频、下载文件等敏感静态资源。
确认模块是否已编译进 Nginx
该模块不是默认全量启用的,需检查是否在编译时加入了 --with-http_secure_link_module:
- 运行
nginx -V 2>&1 | grep -o with-http_secure_link_module,若输出该字符串,说明可用 - Ubuntu/Debian 官方
nginx-full包通常包含;但nginx-light不含 - CentOS Stream 8+ 及部分 Alpine 镜像默认不含,需自行编译或换用 OpenResty
- 若未启用,需重新编译 Nginx:添加
./configure --with-http_secure_link_module参数
基础配置:签名 + 过期时间校验
在 location 块中定义校验逻辑,核心是两行指令配合 $secure_link 变量判断:
-
secure_link $arg_token,$arg_expires;—— 从 URL 提取?token=xxx&expires=1743728400两个参数 -
secure_link_md5 "your_secret_key$uri$arg_expires";—— 注意:$uri是解码后的路径(不含查询参数),且不自动处理编码,建议统一使用原始路径格式 -
$secure_link值为"1"表示合法,"0"表示过期,空字符串表示签名错误
增强配置:绑定客户端 IP 防共享令牌
防止生成的链接被他人截获复用,可在签名中加入 $remote_addr:
secure_link $arg_token,$arg_expires,$remote_addr;secure_link_md5 "your_secret_key$uri$arg_expires$remote_addr";- 这样同一 token 在不同 IP 下无法通过校验,提升单次访问安全性
- 注意:若 Nginx 前有代理(如 CDN 或 LB),需确保
$remote_addr是真实客户端 IP,可通过set_real_ip_from和real_ip_header配合修正
响应控制与错误处理
根据 $secure_link 的值做差异化响应,避免暴露校验逻辑:
-
if ($secure_link = "") { return 403; }—— 签名无效,拒绝访问 -
if ($secure_link = "0") { return 410; }—— 已过期,返回“资源已不可用”更合理 - 可选:添加安全响应头,如
add_header X-Content-Type-Options nosniff;防 MIME 类型嗅探 - 不建议在错误页中返回详细原因,防止信息泄露











