nginx 用 secure_link 模块校验 url 签名与过期时间后,通过 proxy_pass 安全转发至后端;需保持原始 $uri 校验、用 set 构造上游地址、传递可信请求头,并严格管理密钥。

用 secure_link 配合 proxy_pass 实现静态资源限时授权访问,关键在于让 Nginx 在校验签名和时效性之后,把合法请求安全地转发给后端服务(比如文件存储服务、对象存储网关或内部 API),而不是直接暴露真实路径或依赖本地文件系统。整个流程不经过后端鉴权,纯由 Nginx 完成校验与路由。
明确 secure_link 的校验逻辑
secure_link 模块通过 URL 参数(如 st 和 e)携带签名和过期时间,Nginx 用预设密钥重新计算 MD5 值并比对:
-
secure_link $arg_st,$arg_e;提取签名和过期时间参数 -
secure_link_md5 "my_secret_key$uri$arg_e";构造校验字符串(注意:密钥、URI、过期时间三者顺序必须与生成签名时完全一致) -
$secure_link变量值为 "" 表示签名无效,为 "0" 表示已过期,为 "1" 才放行
避免 rewrite 干扰校验顺序
常见错误是先用 rewrite 改写 URI,再进 secure_link 校验——这会导致原始 $uri 失真,签名验证必然失败。正确做法是:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 在校验阶段保持原始
$uri不变 - 校验通过后,再用
set构造目标路径或上游地址,例如:set $upstream_url "http://file-backend/internal/files$uri"; - 后续用
proxy_pass $upstream_url;转发,而非硬编码路径
proxy_pass 需配合变量与可信头传递
当请求被 proxy_pass 转发到后端时,要确保后端能识别原始客户端意图,同时防止绕过校验:
- 显式设置
proxy_set_header X-Secure-Link-Valid "1";向后端传递校验结果(可选,用于审计或二次防护) - 保留原始 Host 和真实 IP:
proxy_set_header Host $host;<br>proxy_set_header X-Real-IP $remote_addr;
- 禁用缓存干扰:
proxy_cache off;(除非你明确配置了可信的缓存策略)
生产环境密钥管理要点
密钥 my_secret_key 必须保密且全局唯一:
- 禁止硬编码在 nginx.conf 中公开提交或部署
- 推荐用
envsubst替换环境变量,例如:secure_link_md5 "${SECURE_LINK_SECRET}$uri$arg_e"; - 容器化部署时,通过 Secret 挂载或配置中心动态注入
- 定期轮换密钥,并兼容旧签名过渡期(需业务侧同步更新签发逻辑)










