我编写了类似于以下代码来获取重定向网址,此代码在我的本地计算机上正常工作,但是在我的托管服务器上,主机服务器上的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);
?>
答案 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/