我怎样才能用卷曲的目标网址?(How can I get the destination URL u

2019-07-18 08:41发布

我如何使用cURL当HTTP状态代码是302得到的目标网址?

<?PHP
$url = "http://www.ecs.soton.ac.uk/news/";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$html = curl_exec($ch);
$status_code = curl_getinfo($ch,CURLINFO_HTTP_CODE);

if($status_code=302 or $status_code=301){
  $url = "";
  // I want to to get the destination url
}
curl_close($ch);
?>

Answer 1:

您可以使用:

echo curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);


Answer 2:

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_HEADER, TRUE); // We'll parse redirect url from header.
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, FALSE); // We want to just get redirect url but not to follow it.
$response = curl_exec($ch);
preg_match_all('/^Location:(.*)$/mi', $response, $matches);
curl_close($ch);
echo !empty($matches[1]) ? trim($matches[1][0]) : 'No redirect found';


Answer 3:

响应的有点过时,但想展示一个完整的工作例如,一些解决方案在那里是件:

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url); //set url
    curl_setopt($ch, CURLOPT_HEADER, true); //get header
    curl_setopt($ch, CURLOPT_NOBODY, true); //do not include response body
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); //do not show in browser the response
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); //follow any redirects
    curl_exec($ch);
    $new_url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL); //extract the url from the header response
    curl_close($ch);

这适用于任何重定向,如301或302,但在404的它只是返回请求的原始URL(因为它没有被发现)。 这可以用于更新或删除您的网站的链接。 这是我的需要呢。



Answer 4:

你必须抓住对重定向的URL Location头。



Answer 5:

对于位于HTTP标头字段“位置” 302重定向IST新的目的地。 例:

HTTP/1.1 302 Found
Date: Tue, 30 Jun 2002 1:20:30 GMT
Server: Apache
Location: http://www.foobar.com/foo/bar
Content-Type: text/html; charset=iso-8859-1

只需用正则表达式grep显示它。

要包括所有的HTTP头信息它包括与卷曲选项CURLOPT_HEADER结果。 与设置:

curl_setopt($c, CURLOPT_HEADER, true);

如果你只是想卷曲遵循重定向使用CURLOPT_FOLLOWLOCATION:

curl_setopt($c, CURLOPT_FOLLOWLOCATION, true);

总之,由于HTTP的StatusCode 302仅仅是一个临时重定向你不应该使用新的URI。



Answer 6:

在回答关于Tamik Soziev的回答user437797的评论(我遗憾的是没有信誉直接评论那里):

该CURLINFO_EFFECTIVE_URL工作正常,但为它做的运算希望你也必须CURLOPT_FOLLOWLOCATION设置为TRUE,当然。 这是因为CURLINFO_EFFECTIVE_URL返回正是它说,越来越装载的最终有效的URL。 如果不进行重定向,那么这将是你的请求的URL,如果你遵循重定向那么这将是被重定向到最终网址。

这种方法的好处是,它也可以有多个重定向,而检索和解析HTTP头自己,你可能必须是多次做最后的目标网址暴露之前时。

还要注意的是重定向的最大数量如下卷曲可以通过CURLOPT_MAXREDIRS控制。 默认情况下,它是无限的(-1),但如果配置和一些URL重定向无尽循环的人(也许是故意),这可能让你陷入困境。



Answer 7:

这里有一种方式来获得由卷曲的HTTP请求,以及状态代码和标题行每头阵列返回的所有头。

$url = 'http://google.com';
$opts = array(CURLOPT_URL => $url,
              CURLOPT_RETURNTRANSFER => true,
              CURLOPT_HEADER => true,
              CURLOPT_FOLLOWLOCATION => true);

$ch = curl_init();
curl_setopt_array($ch, $opts);
$return = curl_exec($ch);
curl_close($ch);

$headers = http_response_headers($return);
foreach ($headers as $header) {
    $str = http_response_code($header);
    $hdr_arr = http_response_header_lines($header);
    if (isset($hdr_arr['Location'])) {
        $str .= ' - Location: ' . $hdr_arr['Location'];
    }
    echo $str . '<br />';
}

function http_response_headers($ret_str)
{
    $hdrs = array();
    $arr = explode("\r\n\r\n", $ret_str);
    foreach ($arr as $each) {
        if (substr($each, 0, 4) == 'HTTP') {
            $hdrs[] = $each;
        }
    }
    return $hdrs;
}

function http_response_header_lines($hdr_str)
{
    $lines = explode("\n", $hdr_str);
    $hdr_arr['status_line'] = trim(array_shift($lines));
    foreach ($lines as $line) {
        list($key, $val) = explode(':', $line, 2);
        $hdr_arr[trim($key)] = trim($val);
    }
    return $hdr_arr;
}

function http_response_code($str)
{
    return substr(trim(strstr($str, ' ')), 0, 3);
}


Answer 8:

使用curl_getinfo($ch)并且第一个元素( url )将指示有效的URL。



文章来源: How can I get the destination URL using cURL?
标签: php html http curl