如何让Vidhd视频链接请求使用访客IP而非服务器IP?
解决Vidhd视频URL绑定服务器IP的问题
问题分析
Vidhd生成的视频播放URL会和发起请求的IP地址绑定——你用服务器IP请求嵌入页拿到的URL,只能在服务器的IP环境下播放,访客用自己的IP访问自然会触发IP验证失败。要解决这个问题,核心是让获取视频URL的请求使用访客的真实IP,或者绕过IP绑定限制。
下面是三种可行的解决方案,按推荐优先级排序:
方案1:让客户端直接获取视频URL(推荐)
把解析视频URL的逻辑从后端移到前端(访客的浏览器),这样请求Vidhd嵌入页的是访客自己的IP,拿到的URL自然绑定访客IP,完全避免服务器IP的问题。
示例JavaScript代码:
fetch('https://vidhd.net/embed-bc3c7z8e8pmt.html') .then(response => response.text()) .then(html => { // 复用你之前的正则表达式匹配视频URL const regex = /(https|http)[^"]*(?=",label)/g; const matches = html.match(regex); if (matches) { const videoUrls = {}; if (matches.length >= 1) videoUrls.p720 = matches[0]; if (matches.length >= 2) videoUrls.p480 = matches[1]; if (matches.length >= 3) videoUrls.p360 = matches[2]; console.log('获取到视频URL:', videoUrls); // 这里可以用拿到的URL初始化播放器 } else { console.error('未找到可用的视频URL'); } }) .catch(err => console.error('请求嵌入页失败:', err));
⚠️ 注意:如果Vidhd开启了CORS限制,前端直接请求会失败,此时需要用方案2或3。
方案2:PHP后端模拟访客IP请求
用curl替代file_get_contents,在请求Vidhd嵌入页时添加X-Forwarded-For和X-Real-IP头,模拟访客的真实IP。
修改后的PHP代码:
<?php // 获取访客真实IP(兼容代理场景) function getVisitorIP() { if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { return explode(',', $_SERVER['HTTP_X_FORWARDED_FOR'])[0]; } elseif (!empty($_SERVER['HTTP_X_REAL_IP'])) { return $_SERVER['HTTP_X_REAL_IP']; } return $_SERVER['REMOTE_ADDR']; } $visitorIp = getVisitorIP(); $embedUrl = "https://vidhd.net/embed-bc3c7z8e8pmt.html"; // 初始化curl请求 $ch = curl_init($embedUrl); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 添加IP伪装头 curl_setopt($ch, CURLOPT_HTTPHEADER, [ "X-Forwarded-For: $visitorIp", "X-Real-IP: $visitorIp" ]); // 模拟访客浏览器的User-Agent curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); $pageContent = curl_exec($ch); curl_close($ch); if ($pageContent === false) { echo json_encode(['error' => '请求嵌入页失败']); exit; } // 复用你原有的正则匹配逻辑 $regex = '/(https|http)[^"]*(?=",label)/'; $TakeJsonToList = []; if (preg_match_all($regex, $pageContent, $allurlget)) { $TakeJsonToList = $allurlget[0]; } $videoUrls = []; if (count($TakeJsonToList) >= 1) $videoUrls['p720'] = $TakeJsonToList[0]; if (count($TakeJsonToList) >= 2) $videoUrls['p480'] = $TakeJsonToList[1]; if (count($TakeJsonToList) >= 3) $videoUrls['p360'] = $TakeJsonToList[2]; echo empty($videoUrls) ? json_encode(['error' => 'Url Not Found']) : json_encode($videoUrls); ?>
⚠️ 说明:如果Vidhd直接读取TCP连接的真实IP(而非HTTP头),这种伪装方法会失效,此时只能用方案3。
方案3:PHP作为视频流代理(兜底方案)
如果前两种方法都无效,你可以让服务器作为中间代理:访客请求你的服务器,服务器用自己的IP去拉取Vidhd的视频流,再把流转发给访客。这样访客不需要直接访问Vidhd的绑定URL。
简化版示例代码:
<?php // 这里填入你从Vidhd拿到的绑定服务器IP的视频URL $videoUrl = "https://s4.vidhd.net/kmxssvaapjumwmesrlvuyy72hjmxnedreq2ahr5kil6qqt373orzkuun4ccq/v.mp4"; // 初始化curl请求视频流 $ch = curl_init($videoUrl); curl_setopt($ch, CURLOPT_RETURNTRANSFER, false); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 传递访客的请求头(保证播放兼容性) foreach (getallheaders() as $name => $value) { if ($name !== 'Host') { curl_setopt($ch, CURLOPT_HTTPHEADER, ["$name: $value"]); } } // 设置响应头,让浏览器识别视频流 $contentType = curl_getinfo($ch, CURLINFO_CONTENT_TYPE); header("Content-Type: $contentType"); header("Content-Length: " . curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD)); // 输出视频流给访客 curl_exec($ch); curl_close($ch); ?>
⚠️ 注意:这种方法会消耗大量服务器带宽,大流量场景下成本很高,仅作为兜底方案使用。
内容的提问来源于stack exchange,提问作者Mo Sattout
相关产品推荐
相关产品推荐

