Nginx 的 secure_link 模块可实现无需后端参与的带时效、防伪造文件防盗链,通过 URL 携带签名(st)和过期时间戳(e),由 Nginx 实时校验;需确认模块启用、配置 location 中的 secure_link 指令与 MD5 签名规则,并注意密钥管理、时间同步及 CDN 缓存控制。

直接用 Nginx 自带的 secure_link 模块就能实现带时效、防伪造的文件防盗链,不需要后端参与,核心是 URL 中携带签名和过期时间,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
配置 location 实现校验逻辑
在对应资源路径的 location 块中设置,例如保护 /download/ 下所有文件:
- 用
secure_link $arg_st,$arg_e提取 URL 中的签名(st)和过期时间戳(e) - 用
secure_link_md5 "your_secret$uri$arg_e"定义签名生成规则:密钥 + 请求路径($uri,不含 query string,以/开头)+ 过期时间戳 - 通过
$secure_link变量判断结果:
• 空字符串 → 参数缺失或签名错误,建议返回403
•"0"→ 签名正确但已过期,建议返回410
•"1"→ 校验通过,可配合alias提供文件
生成合法访问链接
签名必须严格匹配 Nginx 的计算逻辑。推荐用脚本生成,关键点:
-
$uri是原始路径(如/download/app.zip),不带查询参数,也不自动解码,签名时需保持一致 - 过期时间用 Unix 时间戳(秒级),比如
int(time.time()) + 3600表示 1 小时后失效 - MD5 计算对象为纯字符串拼接(如
"mykey/download/app.zip1717027200"),取其十六进制摘要,直接作为st参数值 - 完整 URL 示例:
https://example.com/download/app.zip?st=889da769f9507a4c97dfa153c9566088&e=1717027200
安全与运维注意事项
生产环境容易忽略但影响实际效果的细节:
- 密钥不要硬编码在配置里,可通过
env或 Nginx 变量注入,便于轮换 - 确保服务器时间准确(启用 NTP 同步),否则时间戳校验会频繁失败
- 禁用
autoindex,避免目录被列出来;alias路径末尾不加斜杠 - 若使用 CDN,需设置
Cache-Control: private,防止带st/e的 URL 被缓存


















