PHP cURL请求跨域文件返回空白页、触发406错误如何解决
问题修正方案
核心错误定位
zalmos代理能正常拉取内容,本质是它不会触发CDN的拦截规则,而你当前的cURL代码存在多处直接触发拦截的硬伤:
- 手动配置了错误的
Host: example.com请求头。你的目标请求域名是smumcdnems01.cdnsrv.jio.com,Nginx CDN 会基于Host头匹配对应站点规则,Host不匹配时直接返回406 Not Acceptable 或空响应。 - 手动声明了
Accept-Encoding: gzip, deflate, sdch,但没有开启cURL的自动解压能力。CDN会按照你声明的压缩格式返回二进制压缩内容,直接输出时就会呈现完全空白的效果,看起来和没有返回内容一致。 - 配置的UA值为占位字符串
agent,属于明显的爬虫识别特征,会直接被CDN的WAF规则拦截。 - 携带了Chrome内部调试头
X-Chrome-offline,这类非用户正常请求会携带的字段,是WAF判定异常请求的核心标记,会直接触发拦截。 - 所有鉴权字段都填写的是无意义占位值,比如
appkey: 1111111、deviceId: device id,这类值根本无法通过CDN的基础鉴权校验。
修正后的可运行代码
$url = "http://smumcdnems01.cdnsrv.jio.com/jiotv.live.cdn.jio.com/" . $ch . "/" . $ch . "_" . $q . ".m3u8" . $tok; $curl = curl_init($url); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // 自动处理压缩内容,无需手动声明Accept-Encoding头 curl_setopt($curl, CURLOPT_ENCODING, ""); // 自动跟随302跳转,适配CDN的临时跳转逻辑 curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); $headers = array( // 替换为真实的移动端浏览器UA,不要使用占位字符串 "User-Agent: Mozilla/5.0 (Linux; Android 12; M2101K6G) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36", "lbcookie: 300", "devicetype: 1", "os: android", // 替换为真实有效的鉴权参数值 "appkey: 你的有效appkey", "deviceId: 你的真实设备ID", "uniqueId: 你的真实唯一标识", "ssotoken: 你的有效SSO令牌", "Upgrade-Insecure-Requests: 1", "Connection: keep-alive", "Accept: */*", "Accept-Language: en-GB,en-US;q=0.9,en;q=0.8", "subscriberId: 你的有效订阅者ID", ); curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); // 调试阶段可临时关闭SSL校验 curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); $resp = curl_exec($curl); // 调试时打印请求错误信息,快速定位问题 $curlErr = curl_error($curl); curl_close($curl); echo $url; echo $resp; if ($curlErr) { echo "请求异常:" . $curlErr; }
避坑注意事项
- 永远不要手动设置
Host头,cURL会自动从目标URL中提取正确的Host值,手动填写极容易匹配错误触发CDN拦截。 - 如果修正后仍返回406,可通过浏览器开发者工具抓取真实请求的完整头信息,逐一比对补齐缺失的Cookie、鉴权字段,不要使用无意义的占位值。
- 不要携带和真实用户场景无关的自定义调试头,这类字段是CDN WAF识别恶意爬虫的核心判断依据。
内容的提问来源于stack exchange,提问作者PIYUSH ADLAKHA
相关产品推荐
相关产品推荐

