如何知道哪个页面是在PHP中重定向到的URL?

时间:2010-01-07 06:41:43

标签: php

如果我有一个URL(例如http://www.foo.com/alink.pl?page=2),我想确定我是否被重定向到另一个链接。我也想知道最终的网址(例如http://www.foo.com/other_link.pl)。

我想知道如何在PHP中执行此操作

谢谢大家的帮助:)

(更多信息:

我希望有一个名为doesItDirect($ url)的函数,如果为true,则返回重定向到的url,如果为false则返回相同的url

3 个答案:

答案 0 :(得分:2)

如果您使用的是cURL,则可以执行此处记录的curl_getinfo ($ch, CURLINFO_EFFECTIVE_URL)http://sg.php.net/manual/en/function.curl-getinfo.php

示例:

<?php
    $ch = curl_init ('http://www.foo.com/alink.pl?page=2');
    curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);

    curl_exec ($ch);

    if (!curl_errno ($ch))
        $url = curl_getinfo ($ch, CURLINFO_EFFECTIVE_URL);

    curl_close ($ch);

    echo $url;
?>

答案 1 :(得分:1)

您需要对所述网址执行http请求并检查您获得的响应标头。 301302响应意味着它是重定向。重定向网址包含在response headers中,看起来像Location: <url>

更新:手册提供了一个有用的example,我把它放在一起,这似乎有效:

<?php  
function isRedirectUrl($url) {
    $redirectCodes = array(301, 302, 303, 307);

    if ($fp = fopen($url, 'r')) {
        $meta = stream_get_meta_data($fp);

        list($http_version, $code, $message) = explode(' ', $meta['wrapper_data'][0], 3);

        if (in_array(intval($code), $redirectCodes)) {
            foreach ($meta['wrapper_data'] as $header) {
                list($name, $value) = explode(':', $header, 2);

                if ($name == 'Location') {
                    return trim($value);
                }
            }    
        }

        fclose($fp);
    }

    return false;
}

function getCanonicalUrl($url) {
    $ret = $url;
    while ($test = isRedirectUrl($ret)) {
        if ($test) {
            $ret = $test;
        }
    }

    return $ret;
}

var_dump(getCanonicalUrl('http://<url to test>'));
?>

答案 2 :(得分:0)

这并不容易。

这不是不可能,但它非常难受。这些是您可以进行重定向的方法:

标头重定向。

这是你要求“gimmiemypage.php”的地方而不是发送“200 - OK”作为状态,它发送一个“30? - 重定向”标题(Where?是1或2)。这很容易被发现,因为卷曲会告诉你。乌拉。

HTML刷新重定向。

这是你解析后使用a和一秒钟的地方,浏览器会向前转发你。

这很难检测,因为您必须专门查找元标题,因此您需要解析任意HTML(Do Not Use Regexes for this, That Would Be Bad)以查找这些标记。他们应该总是在,但那些古怪的karazee webdevelopers可能会隐藏它们。

然后有Javascript重定向。在不评估javascript的情况下查找这些内容几乎是不可能的。您可以通过各种不同的方式在JS中重定向人员,但您可以通过解析器捕获这些方法。但是,因为这是JS,你最终需要阅读和评估你可以在页面上看到的所有JS,以及包含的JS,以及任何包含...的内容......

我的建议是尝试找到一种并不意味着你需要了解所有重定向的方法,因为它是一个非常深入的好处。