' REDIRECT_URL'没有在curl_getinfo中返回

时间:2013-05-30 15:36:45

标签: php curl

我编写了类似于以下代码来获取重定向网址,此代码在我的本地计算机上正常工作,但是在我的托管服务器上,主机服务器上的curl版本不支持'redirect_url',你知道吗?我能解决这个问题吗?即,如何实现相同的目标(使用referer发出http请求,然后在没有'redirect_url'帮助的情况下获取重定向URL),谢谢!

<?php
$ch = curl_init(); 

$referer= "xxx";
$url = "xxx";

curl_setopt($ch, CURLOPT_REFERER, $referer);
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

$result = curl_exec($ch);

$info = curl_getinfo($ch);

$redirect_url = $info['redirect_url'];

curl_close($ch);
?>

5 个答案:

答案 0 :(得分:4)

根据 documentation curl_getinfo不会返回名为"redirect_url"的数组键。您可能需要CURLINFO_EFFECTIVE_URL或数组键"url"

  • $redirect_url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);

  • $redirect_url = $info["url"];

CURLINFO_EFFECTIVE_URL 是最后一个有效网址,因此如果请求被重定向,那么最终网址就会在这里。


另请注意,如果您希望curl遵循重定向,那么您需要在发出请求之前设置CURLOPT_FOLLOWLOCATION

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

答案 1 :(得分:3)

我所做的解决方案是允许插件返回标头并提取位置参数

curl_setopt($ch, CURLOPT_HEADER, 1);
$exec=curl_exec($ch);
$x=curl_error($ch);
$cuinfo = curl_getinfo($ch);

if( $cuinfo['http_code'] == 302 && ! isset($cuinfo['redirect_url']) ){

    if(stristr($exec, 'Location:')){


        preg_match( '{Location:(.*)}' , $exec, $loc_matches);
        $redirect_url = trim($loc_matches[1]);

        if(trim($redirect_url) !=  ''){
            $cuinfo['redirect_url'] = $redirect_url;
        }


    }

}

答案 2 :(得分:1)

PHP 5.3.7 介绍了CURLINFO_REDIRECT_URL。 看到你没有旧版本

答案 3 :(得分:0)

CURL没有redirect_url,而是使用url,所以请替换它:

$redirect_url = $info['redirect_url'];

用这个:

$redirect_url = $info['url'];

答案 4 :(得分:0)

如果我在没有FOLLOWLOCATION的情况下使用curl,我会在curl info中获得一个redirect_url元素。这简化了“手动”重定向的任务,但似乎它取决于curl版本。

另一种方法是分析响应标头并从那里获取重定向网址。这有助于: http://slopjong.de/2012/03/31/curl-follow-locations-with-safe_mode-enabled-or-open_basedir-set/