如何使用php/.htaccess密码保护quicktime流视频是最佳方式?它们使用rtsp进行流式传输,但如果需要,我可以使用其他格式。
我知道如何使用php进行身份验证,但我不确定如何设置身份验证,以便保护流媒体文件的url,以防止用户只是复制url并分享它。
或者,我是否过于考虑了,我可以使用普通的身份验证方案并将文件放置在受保护的目录中?
如何使用php/.htaccess密码保护quicktime流视频是最佳方式?它们使用rtsp进行流式传输,但如果需要,我可以使用其他格式。
我知道如何使用php进行身份验证,但我不确定如何设置身份验证,以便保护流媒体文件的url,以防止用户只是复制url并分享它。
或者,我是否过于考虑了,我可以使用普通的身份验证方案并将文件放置在受保护的目录中?
nginx和lighttpd web服务器都有X-Send-File头,你可以从PHP返回。因此,您可以在PHP中进行检查,然后有条件地提供文件。
if (check_user_can_access()){
header('X-sendfile: /path/to/file');
} else {
header('HTTP/1.1 403 Fail!');
}
Lighttpd还有一个很棒的模块叫做mod_secure_download,允许您编程生成一个仅在短时间内有效的URL。
Nginx和可能的lighttpd允许您限制下载速度,这样您就不会以比消费更快的流数据发送出去。
无论哪种方式,您都希望使用Web服务器来提供文件。通过PHP提供它们是可能的,但速度慢。
尝试使用Amazon S3服务,它有一些怪癖,但一旦熟悉了就很容易理解。
他们的API中有钩子可以实现指定时间内有效的临时URL,因此您可以自由地向访问者显示URL,因为10分钟后或更长时间它将无法工作。
这几乎是使用php完成的微不足道的事情(大约15行代码),他们的论坛上有很多示例,因此您不需要从头开始阅读完整的文档来实现此目标。
在生成和显示链接之前,您将进行什么样的授权取决于您。
您还可以使其看起来像是从您的域名提供服务,例如video.yourdomain.com,而不是标准的s3 URL。
最后,它很便宜-当我上传了8 GB并完全下载了3次并初始化了大约100次下载时,我们支付了约2美元的测试和部署费用。我为此做事的人对价格非常满意,他想将所有可下载媒体都转移到s3。
现在,重新阅读我写的一切,它看起来像商业广告/垃圾邮件,但是我对这项服务感到非常满意,因为我之前编写了所有音频文件的代码,直到一切都正常工作花了数天,而这只需要几个小时来实施(主要是熟悉服务)。
<?php
if ( isAuthorised($_POST['user'], $_POST['pass']) ) {
header("X-Sendfile: $somefile");
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; file=\"$somefile\"");
exit(0);
} else {
show403('bad credentials');
}
?>
这个模块也适用于其他的Web服务器。如果我没记错的话,这个想法最初来自lighttpd,但正如Josh所说,它也适用于nginx。
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_COOKIE} obscurename=obscurevalue [NC]
RewriteCond %{HTTP_REFERER} !^http://(www\.)?yourdomain.com/.*$ [NC]
RewriteRule \.(asx¦ASX)$ http://www.yourdomain.com/images/leech.gif [R,L]
<?php
// You could also check some sort of session variable
// that is set when the user visits another part of your
// site
if(!isLoggedIn()){
header("Location: errorPage.htm");
exit;
}else{
// Get the name of the file specified
$file = get_file_name($_GET['fileID']);
// Specify the proper mime-type for the data you're sending
// (this may have to change, depending on your situation)
header("Content-type: video/vnd.rn-realvideo");
// Read the file and output it to the browser
readfile($file);
}
?>