Php cURL,获取指向变量的重定向url

Php cURL,获取指向变量的重定向url,php,curl,redirect,Php,Curl,Redirect,我用curl来填表格。完成post后,处理表单的另一个脚本将重定向到另一个URL。我想将此重定向URL放入变量。您可以使用 curl_setopt($CURL, CURLOPT_HEADER, TRUE); 并解析位置的头文件头文件您可能希望将CURLOPT_FOLLOWLOCATION设置为true 或者将CURLOPT_头设置为true,然后使用regexp获取位置头。这里我获取资源http头,然后将头解析为数组$retVal。我从这里得到了解析头的代码(),如果您有(PECL-PECL_

我用curl来填表格。完成post后,处理表单的另一个脚本将重定向到另一个URL。我想将此重定向URL放入变量。

您可以使用

curl_setopt($CURL, CURLOPT_HEADER, TRUE);

并解析
位置的头文件
头文件

您可能希望将CURLOPT_FOLLOWLOCATION设置为true


或者将CURLOPT_头设置为true,然后使用regexp获取位置头。

这里我获取资源http头,然后将头解析为数组$retVal。我从这里得到了解析头的代码(),如果您有(PECL-PECL_-http>=0.10.0),也可以使用它

$ch=curl_init();
$timeout=0;
curl_setopt($ch,CURLOPT_URL,$URL);
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout);
curl_setopt($ch,CURLOPT_头,TRUE);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_BINARYTRANSFER,1);
//获取二进制数据
$header=curl\u exec($ch);
$retVal=array();
$fields=explode(“\r\n”,preg_replace('/\x0D\x0A[\x09\x20]+/','','',$header));
foreach($fields作为$field){
if(preg_match('/([^::]+):(.+)/m',$field,$match)){

$match[1]=preg_replace('/(?查找重定向url的简单方法(如果您不想提前知道)


没问题,使用post字段将发送数据,然后服务器将重定向,当数据作为响应输出时,curl将拾取该数据,这样位置头就应该在那里。另外请注意php安全模式,我尝试了此解析代码,但不起作用,我在“explode()”上遇到了几个错误第二部分:将数组转换为字符串在
preg\u replace
/e修饰符被弃用了
有人能更新这个答案吗?发现这很有帮助,代码行更少,正则表达式更复杂。它是
curlinfou REDIRECT\u URL
但我在这里找到了!!!curlinfou REDIRECT\u URL被添加到5.3.7中,但没有文档。B从源头上看,我假设这是(第一个)如果curl调用未使用自动重定向,则重定向url值。因此,如果启用了重定向,我们将知道下一个url是什么。感谢@Sparky强迫我挖掘。
CURLINFO\U有效url
对我有效。
CURLINFO\U重定向\U url
不会返回任何内容,也许我只是做错了什么事=/CURLINFO\U有效\URL为我返回当前(请求的)页面。没有重定向(位置:)curl\u info结果中的url。似乎解析标题是最佳做法…禁用CURLOPT\u FOLLOWLOCATION选项:在上一个事务中找到的重定向url,接下来应该手动请求。启用CURLOPT\u FOLLOWLOCATION选项:这是空的。在这种情况下,重定向url在CURLINFO\u FOLLOWLOCATION中可用副本
        $ch = curl_init();
        $timeout = 0;
        curl_setopt ($ch, CURLOPT_URL, $url);
        curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
        curl_setopt($ch, CURLOPT_HEADER, TRUE);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
        // Getting binary data
        $header = curl_exec($ch);
        $retVal = array();
        $fields = explode("\r\n", preg_replace('/\x0D\x0A[\x09\x20]+/', ' ', $header));
        foreach( $fields as $field ) {
            if( preg_match('/([^:]+): (.+)/m', $field, $match) ) {
                $match[1] = preg_replace('/(?<=^|[\x09\x20\x2D])./e', 'strtoupper("\0")', strtolower(trim($match[1])));
                if( isset($retVal[$match[1]]) ) {
                    $retVal[$match[1]] = array($retVal[$match[1]], $match[2]);
                } else {
                    $retVal[$match[1]] = trim($match[2]);
                }
            }
        }
//here is the header info parsed out
echo '<pre>';
print_r($retVal);
echo '</pre>';
//here is the redirect
if (isset($retVal['Location'])){
     echo $retVal['Location'];
} else {
     //keep in mind that if it is a direct link to the image the location header will be missing
     echo $_GET[$urlKey];
}
curl_close($ch);
$last_url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);