通过使用cURL获取重定向的URL

时间:2019-02-22 05:48:09

标签: php curl

我正在尝试找到要重定向到的位置。因此,我尝试为此功能,但是这些都无法正常工作。

链接在这里。尝试输入时,您将被重定向:

https://lions-mansion.jp/MA141070/

所以我尝试使用cURL,

function redirect1($url) { 
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_HEADER, false);
        curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
        curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT ,0);
        curl_setopt($ch, CURLOPT_TIMEOUT, 60);
        $data = curl_exec($ch);
        $data = curl_getinfo($ch,CURLINFO_EFFECTIVE_URL );
        curl_close($ch);

        return $data;
    }

还有这个:

function redirect($url) {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_HEADER, true);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $result = curl_exec($ch);
        if (preg_match('~Location: (.*)~i', $result, $match)) {
           $location = trim($match[1]);
        }

        return $result;
    }

但是我找不到重定向的URL。

2 个答案:

答案 0 :(得分:1)

此页面未使用libcurl可以理解的重定向方案(它使用html <meta http-equiv="REFRESH"-redirect,不受libcurl支持),因此libcurl既不能告诉您将其重定向到的位置,也无法自动遵循重定向(因为libcurl无法理解)

您需要自己从HTML中解析出重定向网址,例如

function redirect1($url) { 
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_HEADER, false);
        curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
        curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT ,0);
        curl_setopt($ch, CURLOPT_TIMEOUT, 60);
        $data = curl_exec($ch);
        $domd=@DOMDocument::loadHTML($data);
        $xp=new DOMXPath($domd);
        // <META http-equiv="REFRESH" content="0;URL=http://sumai.tokyu-land.co.jp/branz/roppongi4/?iad=daikyo" />

        $location=$xp->query("//meta[@http-equiv='REFRESH']")->item(0)->getAttribute("content");
        // 0;URL=http://sumai.tokyu-land.co.jp/branz/roppongi4/?iad=daikyo   
        $location=substr($location,stripos($location,'URL=')+4);
        curl_close($ch);
        return $location;
    }
    var_dump(redirect1('https://lions-mansion.jp/MA141070/'));

输出:

C:\projects\misc>php re.php
string(57) "http://sumai.tokyu-land.co.jp/branz/roppongi4/?iad=daikyo"

答案 1 :(得分:0)

如果让您CURLOPT_RETURNTRANSFERtrue,则在执行CURL命令后,可以使用此函数调用来获取有效URL的重定向:

$finalUrl = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);