PHP获取重定向URL

时间:2015-03-19 11:02:20

标签: php redirect curl guzzle

我已经阅读了有关同一问题的其他一些问题,并尝试了那里的卷曲示例。但是,这些示例不适用于此特定网址http://www.prisjakt.no/redirect.php?prisid=182556713。我得到的只是与重定向相同的链接。

您是否有解决方案来获取后续链接的网址,在本例中为http://www.siba.no/tv-lyd-bilde/hodetelefoner/lukkede-hodetelefoner/sennheiser-momentum-109434

使用Guzzle的解决方案也没问题。

谢谢!

编辑:问题似乎是重定向是通过JS而不是标题。

3 个答案:

答案 0 :(得分:2)

Guzzle确实为Redirects in Requests

提供了一些配置设置

你可以"陷阱"通过向BeforeEvent添加Event Listener来重定向,如下所示:

$request = $client->createRequest('GET', $url);
$request->getEmitter()->on('before', function (BeforeEvent $event) {
    // do something with the event.
});
$response = $client->send($request);

然后在侦听器中,您可以通过调用:

来获取新请求的URL
$event->getRequest()->getUrl()

例如:

$client = new GuzzleHttp\Client();

$request = $client->createRequest('GET', 'http://www.google.com');
$request->getEmitter()->on('before', function (GuzzleHttp\Event\BeforeEvent $e) {
    echo $e->getRequest()->getUrl() . PHP_EOL;
});
$response = $client->send($request);

结果:

  

答案 1 :(得分:0)

cURLCURLOPT_FOLLOWLOCATION选项设置为true以遵循重定向:

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

对于Guzzle,根据their doc

  

默认情况下,Guzzle将使用自动跟踪重定向   大多数Web浏览器使用的非RFC兼容实现。这意味着   重定向POST请求之后是GET请求。您   可以通过在请求上启用严格模式来强制遵从RFC   参数对象:

// Set per request
$request = $client->post();
$request->getParams()->set('redirect.strict', true);

// You can set globally on a client so all requests use strict redirects
$client->getConfig()->set('request.params', array(
    'redirect.strict' => true
));
     

默认情况下,Guzzle会在投掷之前重定向最多5次   Guzzle\Http\Exception\TooManyRedirectsException。你可以举起或   使用请求对象的redirect.max参数降低此值:

$request->getParams()->set('redirect.max', 2);

答案 2 :(得分:0)

function get_real_url($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_BINARYTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); 
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    $html = curl_exec($ch);
    $url = curl_getinfo($ch,CURLINFO_EFFECTIVE_URL );
    curl_close($ch);

    return $url;
}