如何通过CORS阻止他人嵌入我的HLS视频以减少服务器负载?
阻止跨站嵌入HLS视频的解决方案
要阻止他人在自己的网站嵌入你的HLS视频,同时限制浏览器从你的服务器下载TS片段,你可以通过以下几种方式实现——核心是限制只有你的域名能发起合法请求,以此降低不必要的服务器负载:
1. 配置CORS策略限制请求来源
浏览器在跨站加载资源时会触发CORS机制,你可以在服务器端设置响应头,仅允许你的域名发起请求。
不同服务器的配置示例:
- Nginx:在对应
server或location块中添加:
# 允许指定域名的跨域请求 add_header Access-Control-Allow-Origin "https://your-domain.com"; # 允许HLS所需的请求方法 add_header Access-Control-Allow-Methods "GET, OPTIONS"; # HLS播放依赖Range头,必须允许 add_header Access-Control-Allow-Headers "Range";
- Apache:在
.htaccess或站点配置文件中添加:
Header set Access-Control-Allow-Origin "https://your-domain.com" Header set Access-Control-Allow-Methods "GET, OPTIONS" Header set Access-Control-Allow-Headers "Range"
注意:不要使用通配符*作为Access-Control-Allow-Origin的值,否则会允许所有跨站请求,完全起不到限制作用。
2. 验证Referer请求头作为补充
CORS对简单GET请求可能不会触发预检,这时候可以通过检查Referer头来过滤非你的域名发起的请求。
Nginx配置示例:
# 仅允许来自你的域名的请求,空Referer(比如直接在地址栏访问)可根据需求调整规则 if ($http_referer !~* "^https://your-domain.com/.*$") { return 403; }
注意:Referer头可能被用户手动禁用,所以这个方法只能作为CORS的补充,不能单独依赖。
3. 为资源添加临时签名(进阶)
如果想进一步提高盗用门槛,可以给m3u8播放列表和TS片段生成带有效期的签名:
- 服务器端生成包含请求路径、过期时间的签名,将其附加在资源URL上(例如
playlist.m3u8?sign=abc123&expire=1699999999) - 当请求到达服务器时,验证签名的合法性和过期时间,只有通过验证的请求才返回内容
这种方式能有效防止他人长期复用你的资源URL,即使Referer被伪造,签名过期后也无法访问。
额外提示
- Safari对HLS的CORS要求更严格,务必确保服务器正确响应OPTIONS预检请求,且允许
Range请求头,否则可能导致视频无法正常播放。 - 这些方法只能加大跨站盗用的难度,无法完全阻止他人下载内容后自行托管——但这正是你不在意的场景,核心目标(减少服务器负载)可以达成。
内容的提问来源于stack exchange,提问作者s_joe77
相关产品推荐
相关产品推荐

