我的PHP文件中有多个带有源URL的HTML视频标签:
<video class="d-block video-js vjs-default-skin col-video" width="100%" controls:false;>
<source src="<?php echo $videoPath; ?>" type='video/mp4'>
</video>
由客户端加载,source属性在Web浏览器中如下所示:
<source src="./Username/videos/001_video.mp4" type='video/mp4'>
{...}
<source src="./Username/videos/002_video.mp4" type='video/mp4'>
{...}
我的问题是我不希望客户端通过更改视频标签的source属性上的URL来查看其他用户的视频。
这似乎被称为“用户限制内容/资源”(不确定,因为我是C / C ++ dev。)。
我没有在L.A.M.P上使用任何框架,纯PHP。 (Apache2)Web服务器。
我知道这是10年前制作的,并且通过使用框架或其他语言(如NodeJS)有很多新的解决方案,但目前我没有可能改变网站的架构(但它将在未来)。
这可以在Apache配置的服务器端完成(如果可以吗?),或者在HTML / PHP Web端。
我在问之前在网上看到的是像这样的解决方案(https://www.sitepoint.com/community/t/hide-video-url/225822/7),我尝试过:
<source src="video.php?show_the_video=VIDEO_ID/NAME_ENCRYPTED" type='video/mp4'>
在video.php中有这样的东西:
if (($_SERVER['REQUEST_METHOD'] === "GET") && ( isset($_GET['show_the_video']) )) {
$uncryptedPath = decrypt($_GET['show_the_video']);
$ctype = 'video/mp4';
header('Content-Type: ' . $ctype);
$file_path_name = $uncryptedPath;
$handle = fopen($file_path_name, "rb");
$contents = fread($handle, filesize($file_path_name));
fclose($handle);
echo $contents;
} else {
echo "";
}
但它似乎对我不太好(可能因为我在同一页面上有很多视频标签)。它部分工作但加载页面的速度很慢......这对我来说是不可接受的。用大约20个视频标签加载页面需要花费很长时间。
有人可以通过路由我或提出解决方案来帮助我吗?
@ Script47提出的解决方案很简单:
我试过这个,但似乎加载1分钟(~8MB)的视频文件,在PHP中使用fopen()和fread()函数是如此之慢。
在PHP中从MP4文件流式传输到视频源标签的任何方式,但是比fopen()/ fread()快(或使它们更快)?
那么使用RewriteMap呢?您的src标记包含加密的URL。我是你的.htaccess,你写下面的内容:
RewriteMap videos "txt:/path/to/map.txt"
RewriteRule "(crypted-pattern)" "/path/to/videos/${videos:$1}"
您的map.txt看起来像这样,并且必须在上传新视频时进行更新:
hash1 user1/video1.mp4
hash2 user1/video2.mp4
hash3 user2/video1.mp4
# and so on...
用户更改散列URL并获取有效视频文件的概率相当小。
您还可以使用SQL数据库或其他映射类型而不是普通的txt文件。