Nginx secure_link模块通过时间戳与密钥签名实现URL防盗链,校验签名有效性后返回1(通过)、0(过期/无效)或空(缺失/错误),并可自定义403响应;需严格统一URI格式、同步服务器时间、保密密钥。

nginx 的 secure_link 模块可实现基于时间戳和密钥签名的 URL 防盗链,核心是让资源访问 URL 带有“一次性有效”的加密签名,过期或篡改即 403 拒绝。它不依赖数据库或后端逻辑,纯 Nginx 层完成校验,轻量高效。
配置 secure_link 指令与签名规则
需在 location 块中启用 secure_link,并指定用于解析请求参数的变量(如 $arg_st 和 $arg_e):
-
secure_link $arg_st,$arg_e;:从 URL 查询参数中提取签名(st)和过期时间(e) -
secure_link_md5 "your_secret_key$uri$arg_e";:服务端用相同密钥、原始 URI 和过期时间生成 MD5 签名,与st比对 - 签名需 Base64 URL 安全编码(无
+、/、=),Nginx 内部自动处理解码
生成合法的带签名访问链接
前端或后端需按固定格式拼接 URL,例如:https://example.com/file.zip?st=abc123&e=1735689600
-
e是 Unix 时间戳(秒级),表示该链接在该时刻后失效 -
st是对"your_secret_key/file.zip1735689600"做 MD5 后再 Base64 URL 安全编码的结果 - 推荐用脚本生成(Python/PHP/Shell),避免手算;注意保持密钥与 Nginx 配置一致
拦截非法请求并返回友好响应
利用 secure_link 变量控制响应行为:
-
$secure_link为空 → 签名缺失或格式错误 → 返回 403 -
$secure_link为 0 → 签名无效或已过期 → 返回 403 -
$secure_link为 1 → 校验通过 → 正常提供文件 - 可配合
error_page 403 /403.html;或记录日志增强可观测性
注意事项与典型问题排查
常见疏漏点直接影响防护效果:
- URI 必须严格一致:Nginx 中参与签名计算的
$uri不含查询参数,且不自动处理末尾斜杠或编码差异,建议统一标准化路径 - 时钟同步:服务器时间偏差超过过期窗口会导致批量失效,建议启用 NTP
- 密钥保密:密钥一旦泄露,攻击者可任意签发链接,严禁硬编码在前端或日志中
- 不支持子目录批量签发:每个 URI 需独立签名,无法用通配符保护整个
/download/目录(除非统一用相同 URI 模板)










