带过期时间的静态视频鉴权访问问题及.htaccess配置求助
问题解决:静态视频文件的签名URL访问控制
核心问题分析
你现有的.htaccess配置无法生效,核心原因是Apache Rewrite规则无法直接计算MD5哈希值,导致签名验证逻辑完全失效;同时规则顺序、参数提取逻辑也存在混乱,无法正确完成过期时间和签名的校验。
正确实现方案
我们需要通过「.htaccess转发请求 + PHP脚本验证」的方式完成控制,以下是完整配置:
1. 修改.htaccess配置
将所有/files/目录下的请求转发到验证脚本,由PHP完成签名和过期时间校验:
RewriteEngine On # 将/files/下的所有请求转发到验证脚本,保留原查询参数 RewriteRule ^files/(.*)$ /verify.php?file=$1 [L,QSA]
2. 编写验证脚本verify.php
该脚本负责校验URL中的md5和expires参数,验证通过后输出视频文件,否则返回403:
<?php $secret = 'secret-key'; // 和签名生成代码中的密钥保持一致 $allowedExtensions = ['mp4', 'avi', 'mov']; // 按需添加允许的视频格式 // 获取请求参数 $file = $_GET['file'] ?? ''; $providedMd5 = $_GET['md5'] ?? ''; $expires = $_GET['expires'] ?? 0; // 1. 校验参数完整性 if (empty($file) || empty($providedMd5) || !is_numeric($expires)) { http_response_code(403); exit('Forbidden'); } // 2. 校验文件扩展名合法性 $ext = strtolower(pathinfo($file, PATHINFO_EXTENSION)); if (!in_array($ext, $allowedExtensions)) { http_response_code(403); exit('Forbidden'); } // 3. 校验文件是否存在 $filePath = __DIR__ . '/files/' . $file; if (!file_exists($filePath)) { http_response_code(404); exit('Not Found'); } // 4. 校验URL是否过期 if (time() > $expires) { http_response_code(403); exit('URL已过期'); } // 5. 校验签名有效性(和生成逻辑完全一致) $expectedMd5 = md5($file . $expires . $secret); if ($expectedMd5 !== $providedMd5) { http_response_code(403); exit('无效的签名'); } // 验证通过,输出视频文件 header('Content-Type: video/' . $ext); header('Content-Length: ' . filesize($filePath)); readfile($filePath); exit; ?>
3. 保留原签名生成PHP代码
你的签名生成逻辑是正确的,无需修改:
function generateSignedUrl($file, $secret, $expiry) { $md5 = md5($file . $expiry . $secret); return "https://example.com/files/$file?md5=$md5&expires=$expiry"; } $file = "sample-file.mp4"; $secret = "secret-key"; $expiry = time() + 3600; $signedUrl = generateSignedUrl($file, $secret, $expiry); echo "Signed URL: $signedUrl";
关键注意事项
- 确保
verify.php与files目录在网站根目录下,且服务器配置允许PHP脚本读取files目录内的文件。 - 若需限制特定IP或添加更多校验规则,可在
verify.php中扩展逻辑。
内容的提问来源于stack exchange,提问作者nanku singh
相关产品推荐
相关产品推荐

