nginx 中启用 secure_link 模块可实现静态资源安全令牌访问控制,通过签名、过期时间与路径绑定生成一次性令牌,防止盗链和未授权下载,并支持 ip/referer 绑定及安全响应头强化防护。

在 Nginx 中为静态资源配置安全令牌,最直接、轻量且无需后端介入的方式是启用并配置内置的 secure_link 模块。它通过“签名 + 过期时间 + 路径绑定”三要素生成一次性访问令牌,有效防止盗链和未授权下载。
确认模块已启用并配置基础校验
主流发行版(如 Ubuntu/Debian 的 nginx-full、CentOS 的 nginx)通常默认编译了 --with-http_secure_link_module。可通过以下命令验证:
nginx -V 2>&1 | grep -o with-http_secure_link_module
若输出存在,说明模块可用。接着在 location 块中设置校验逻辑:
- 用
secure_link $arg_token,$arg_expires提取 URL 中的?token=xxx&expires=1717027200参数 - 用
secure_link_md5 "your_secret_key$uri$arg_expires"定义签名规则(注意:$uri不含查询参数,也不自动解码) - 检查
$secure_link变量:为空表示签名错误,值为"0"表示已过期
生成合法令牌的关键要点
令牌本质是 MD5 哈希值,必须与 Nginx 配置中的拼接字符串完全一致。常见错误包括 URI 编码不匹配、secret 错位、时间戳格式错误。推荐用脚本生成:
- Python 示例中,
raw = f"{secret}{uri}{expires}"必须和 Nginx 中secure_link_md5后的字符串一模一样 -
$uri是原始请求路径(如/protected/file.pdf),不能带查询参数,也不能提前 decode - 时间戳用 Unix 秒级整数,建议预留 1~2 小时有效期,避免时钟偏差导致误拒
增强安全性:绑定 IP 或 Referer(可选)
基础 secure_link 已具备时效性防护,如需进一步限制,可在生成令牌时加入客户端特征:
- 服务端生成时将用户 IP(
$remote_addr)或 Referer 域名拼入 raw 字符串,Nginx 端同步加入校验逻辑 - 配合
valid_referers指令做双重 Referer 校验,适用于对防盗链要求极高的图片或视频资源 - 注意:IP 绑定在 NAT 或 CDN 场景下可能失效;Referer 可被伪造,仅作辅助手段
搭配其他安全头形成纵深防御
令牌只是访问控制的一环,还需配合响应头强化整体防护:
- 添加
Content-Security-Policy,例如default-src 'none'; img-src 'self';,防止资源被跨站加载执行 - 设置
X-Content-Type-Options: nosniff和X-Frame-Options: DENY,阻断 MIME 类型猜测与 iframe 嵌入 - 对静态资源路径禁用目录浏览(
autoindex off)、禁止敏感文件访问(location ~ \.(git|htaccess|log)$ { return 404; })











