nginx 通过 secure_link 模块实现 mp4/hls 分片防盗链,需校验时间戳与签名,非法请求返回 403;配置包括 secure_link 提取参数、secure_link_md5 定义密钥拼接规则,并用 if 判断拦截无效签名或过期请求。

在 Nginx 中用 proxy_pass 实现多媒体文件(如 MP4、HLS `.m3u8`/`.ts`)的分片防盗链代理,核心不是单纯转发请求,而是结合时间戳、签名验证、Referer/IP 限制、URI 重写与缓存策略,对每个分片请求做动态鉴权。直接 proxy_pass 不带校验等于裸奔。
一、基于时间戳 + 签名的动态防盗链(推荐)
让业务后端生成带有效期和签名的 URL(例如:/video/abc.mp4?t=1717023600&s=abcd1234),Nginx 在反向代理前校验签名与过期时间,非法请求直接 403。
需启用 ngx_http_secure_link_module(通常已内置,无需编译):
- 在
location块中配置secure_link指令提取签名和过期时间 - 用
secure_link_md5定义密钥和拼接规则(如"$uri$arg_t$remote_addr secret_key") - 用
if ($secure_link = "") { return 403; }拦截无效签名 - 用
if ($secure_link_expires 检查过期
示例片段:
macOS 微信消息自动化工具。通过 GUI 自动化实现:发送消息给指定联系人、读取聊天内容、监控新消息。适用于需要自动化微信操作的场景,如定时发送、批量回复、消息备份等。依赖 peekaboo 进行屏幕截图和 UI 交互。仅支持 macOS。开源地址:https://github.com/chairmanmia...
location /video/ {
secure_link $arg_s,$arg_t;
secure_link_md5 "$uri$arg_t$remote_addr your_secret_key";
if ($secure_link = "") {
return 403;
}
if ($secure_link_expires
二、按分片路径做 Referer/IP 白名单 + 动态重写
对 HLS 或 DASH 场景,`.m3u8` 和每个 `.ts`/`.mp4` 分片都走独立请求,可统一拦截并增强校验:
- 用
valid_referers限定合法来源域名,不匹配则 403 - 对特定后缀(如
.ts,.m3u8,.mp4)单独设置 location,避免影响其他资源 - 配合
map指令把带参数的播放页 URL 映射为内部 token,再透传给上游(如加proxy_set_header X-Auth-Token) - 必要时用
rewrite ^/v/(.*)$ /$1 break;清洗路径,适配源站结构
三、代理分片时的关键优化点
多媒体分片请求高频、小而碎,Nginx 代理必须兼顾安全与性能:
- 开启
proxy_buffering off避免阻塞流式响应(尤其 HLS/ts 流) - 设置
proxy_cache_valid 200 206 1h缓存成功响应(206 是范围请求,常见于视频拖拽) - 用
proxy_ignore_headers Expires Cache-Control防止源站头干扰本地缓存策略 - 添加
proxy_set_header Range $http_range和proxy_pass_request_headers on,确保字节范围请求透传正确
四、调试与验证建议
上线前务必验证真实播放链路:
- 用
curl -I "https://yoursite.com/video/test.mp4?t=xxx&s=yyy"检查返回码和头信息 - 抓包 Chrome DevTools → Network,确认 `.m3u8` 请求能返回,且后续每个 `.ts` 请求都带相同签名逻辑
- 故意改签或过期 t 参数,确认返回 403 而非 502/500
- 用
log_format记录$arg_s $arg_t $secure_link $secure_link_expires,快速定位校验失败原因










