首页 > 解决方案 > 使用 $url 时出错,来自 1st Curl 的响应标头,在 2nd Curl 中,但手动编写 url 有效

问题描述

我从第一个 curl 的响应中获取下一个 url,并在 echo 中显示该 url,但是当 1 将 $url 放入第二个 curl 时,它不起作用,直到我在 $ch = curl_init('www.example1.com'); 中手动写入 url;像这样我的php脚本是;

1st Curl


$ch = curl_init('www.example.com');
curl_setopt($ch, CURLOPT_GET, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$output = curl_exec($ch);
curl_close($ch);
$headers = [];
$output = rtrim($output);
$data = explode("\n",$output);
$headers = $data[8];
$url = substr($headers, 10);

echo $url;

///// echo 正在工作并显示 url,但在 curl 下方,当我输入 $url 或 '.$url.' 时它不起作用 但是当我手动放置它时它可以工作.....你能给出任何建议吗?我还尝试将 url 保存在文本文件中并从那里获取第二个 Curl 但没有用

2nd Curl


$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$output = curl_exec($ch);
curl_close($ch);

标签: phpcurl

解决方案


最有可能是不可见/不可打印的字符。

我最好的猜测:在 $url 的末尾有一个不可见的回车字节,它会使您的 url 无效,因为您的标头提取代码有问题。尝试通过此函数运行 url 以验证:

function f(string $url){
    $needles = array(
        "carriage-return"=>"\r",
        "newline"=>"\n",
        "null"=>"\x00"
    );
    for($i=0;$i<strlen($url);++$i){
        $found = array_search($url[$i],$needles,true);
        if($found!==false){
            echo "byte #{$i} contains: {$found} byte.\n";
        }
    }
    
}

如果我是对的,它应该打印如下内容:byte #19 contains: carriage-return byte.

您可以做的另一件事是运行它并使用https://asciitable.comecho bin2hex($url);交叉引用每个字节以查找不可打印的字符。


推荐阅读