2

我编写了类似于以下的代码来获取重定向 url,此代码在我的本地计算机上运行良好,但是在我的托管服务器上,主机服务器上的 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);
?>
4

5 回答 5

4

根据文档curl_getinfo不返回名为"redirect_url". 也许您需要CURLINFO_EFFECTIVE_URL,或者数组键"url"

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

    或者

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

CURLINFO_EFFECTIVE_URL是最后一个有效的 url,所以如果一个请求被重定向,那么最终的url 将在这里。


另外,请注意,如果您希望 curl 跟随重定向,那么您需要CURLOPT_FOLLOWLOCATION在发出请求之前进行设置:

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
于 2013-05-30T15:43:02.263 回答
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;
        }


    }

}
于 2015-11-21T10:39:02.633 回答
2

PHP 5.3.7 引入了 CURLINFO_REDIRECT_URL。看看你没有旧版本

于 2016-01-15T10:22:03.200 回答
0

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

$redirect_url = $info['redirect_url'];

有了这个:

$redirect_url = $info['url'];
于 2013-05-30T15:45:16.710 回答
0

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

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

于 2013-09-28T10:46:27.973 回答