nginx 的 secure_link 是官方内置模块,无需第三方扩展;启用后通过 strict 参数对齐、md5 hex 签名、时间戳校验及 internal 限制即可实现安全下载。

Nginx 的 secure_link 模块是官方内置模块,不是第三方模块。它无需额外安装扩展或 Lua 脚本,只要 Nginx 编译时启用了 --with-http_secure_link_module(主流发行版如 Ubuntu、CentOS 的预编译包默认已启用),即可直接使用。所谓“第三方 secure_link 模块”并不存在——混淆可能源于对 Nginx Plus 商业模块、OpenResty 的 ngx_http_secure_link_module 衍生用法,或误将自定义签名逻辑当作独立模块。
真正要为大文件下载链接生成具备时效性的安全防刷 Token,只需正确配置原生 secure_link,并严格对齐服务端签名逻辑。关键不在“模块来源”,而在参数一致性、时间精度、密钥保密与路径规范。
确保 Nginx 已启用 secure_link 功能
运行以下命令确认模块可用:
nginx -V 2>&1 | grep -o with-http_secure_link_module
若输出含该字符串,说明已支持。若无,请重装带该模块的 Nginx(如 Ubuntu 可用 sudo apt install nginx-full)。
配置 location 实现防刷校验
以大文件下载路径 /dl/ 为例,推荐配置如下(不暴露真实路径,支持高并发):
- 使用
$arg_token和$arg_t作为签名与时间戳参数名,避免与业务参数冲突 -
secure_link_md5必须与后端拼接方式完全一致:密钥 + 原始 URI + 时间戳(无空格、无编码、无换行) - 添加
internal;防止直接访问未鉴权路径 - 配合
add_header Content-Disposition "attachment";强制下载,规避浏览器自动渲染
示例配置:
location /dl/ {
secure_link $arg_token,$arg_t;
secure_link_md5 "my_32byte_secret_key$uri$arg_t";
<pre class="brush:php;toolbar:false;">if ($secure_link = "") { return 403; }
if ($secure_link = "0") { return 410; } # Gone: 签名有效但已过期
# 校验通过,映射到内部存储位置(如 NFS 或本地磁盘)
alias /data/downloads/;
add_header Content-Disposition "attachment";
internal;}
服务端生成 Token(Python 示例,生产可用)
Token 本质是 MD5(secret + uri + t) 的十六进制摘要(非 Base64)。注意:Nginx 7.x+ 默认使用 hex MD5,不是 Base64 编码(旧资料中 Base64 是早期兼容写法,当前主流版本统一用 hex)。
-
$uri是请求路径,含前导/,如/dl/report.pdf,不含查询参数 -
t是 Unix 秒级时间戳,代表过期时刻(例如int(time.time()) + 3600表示 1 小时后失效) - 拼接字符串必须严格按顺序、无分隔符、无 URL decode/encode
Python 生成代码:
import hashlib
import time
<p>uri = "/dl/big-install-v3.2.1.iso" # 必须与 Nginx 中 $uri 完全一致
t = int(time.time()) + 1800 # 30 分钟有效期
secret = "my_32byte_secret_key" # 生产环境建议从环境变量读取</p><h1>拼接并计算 hex MD5</h1><p>raw = f"{secret}{uri}{t}"
token = hashlib.md5(raw.encode()).hexdigest()</p><p>url = f"<a href="https://www.php.cn/link/cdf46b717a85b9a78ef149178f943fd8">https://www.php.cn/link/cdf46b717a85b9a78ef149178f943fd8</a>}"
print(url) # 输出类似:<a href="https://www.php.cn/link/94dc1c77053c9610e275f3ad5a751347">https://www.php.cn/link/94dc1c77053c9610e275f3ad5a751347</a></p>
增强防刷能力的关键实践
-
绑定客户端 IP:在拼接字符串中加入
$remote_addr(需后端同步传入),使 Token 仅对该 IP 有效 -
限制单次使用:虽 native 不支持“一次性”,但可通过后端记录已用 Token + Redis 去重,或结合
map指令做简单频控 -
密钥轮换:定期更新
secure_link_md5中的密钥,并灰度切换新旧 Token 共存期 -
日志审计:记录
$secure_link状态与$remote_addr,便于追踪异常刷量行为











