Php cURL,获取指向变量的重定向url
我用curl来填表格。完成post后,处理表单的另一个脚本将重定向到另一个URL。我想将此重定向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_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);