nginx通过rewrite+变量+lua实现流媒体url动态伪装,将如/play/12345等干净路径内部映射为带时效签名的真实地址,隐藏源路径、参数及后缀,并配合访问控制防止直连盗链。

在 Nginx 中对视频点播系统的流媒体地址做动态伪装,核心是通过 rewrite 指令结合变量(如 $arg_*、$uri、$request_uri)实现 URL 映射,同时配合 proxy_pass 或本地文件路径重写,隐藏真实源地址和参数结构。关键不是简单跳转,而是让客户端请求一个“干净”路径(如 /play/12345),Nginx 在内部将其映射为带鉴权、时间戳、签名等真实流地址(如 /hls/abc.m3u8?token=xxx&t=171xxxx&sign=yyy),且不暴露后端逻辑。
用 rewrite + 变量构造动态代理路径
适用于流媒体服务(如 nginx-rtmp、SRS、或自建 HLS/DASH 服务)对外暴露了带签名的原始地址,但你想统一入口、隐藏参数。Nginx 可提取请求中的 ID 或路径段,拼接成真实后端地址:
- 把
/v/abcd1234→ 内部重写为/hls/abcd1234/index.m3u8?expires=171xxxx&ip=192.168.1.100&sign=xxx - 使用
set定义变量生成时间戳、IP、签名(需配合 Lua 或外部脚本,纯 Nginx 签名能力有限) - 用
rewrite ^/v/(\w+)$ /hls/$1/index.m3u8?expires=$time_iso8601&ip=$remote_addr&sign=stub break;占位(签名建议交由 Lua 处理)
配合 Lua 实现真动态签名与校验(推荐)
纯 Nginx 不支持 HMAC 签名,但 ngx_lua 模块可完成:解析请求路径、生成时效 token、验证签名、再重写 URI。例如:
- 请求:
/play/7890?ts=171xxxx&sig=a1b2c3→ Lua 校验 sig 是否匹配hmac_sha256("7890:171xxxx", SECRET) - 校验通过后,用
ngx.exec()或ngx.redirect()(内部重定向)跳转到真实路径,如/origin/hls/7890/index.m3u8 - 或直接
proxy_pass http://backend/hls/7890/index.m3u8,并在proxy_set_header中透传验证结果
隐藏后缀与协议细节(HLS/DASH 兼容)
避免暴露 .m3u8、.mp4、.dash 等后缀,提升伪装性:
- 用
location ~ ^/stream/(\d+)$匹配无后缀路径,根据 ID 查数据库或配置决定返回 HLS 还是 DASH - 内部 rewrite 到对应格式:
rewrite ^/stream/(\d+)$ /hls/$1/index.m3u8 break;或用 map 匹配类型 - 配合
add_header Content-Type "application/vnd.apple.mpegurl";确保浏览器正确识别
防止盗链与强制走伪装路径
确保所有流请求必须经过伪装层,禁止直连真实地址:
- 在真实流目录(如
/hls/)加valid_referers或 IP 白名单,只允许来自本机 Nginx 的127.0.0.1请求 - 用
if ($request_uri ~ "^/hls/") { return 403; }直接拦截外部对原始路径的访问 - 搭配
secure_link模块做简单时效校验(无需 Lua),适合轻量场景











