繁体   English   中英

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

[英]How to know which page is the URL redirecting to in PHP?

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

我想知道如何在PHP中做到这一点

谢谢大家的帮助 :)

(更多信息:

我想拥有一个称为dosItDirect($ url)的函数,如果返回true,则返回重定向到的URL,如果返回false,则返回传递的URL

如果您使用的是cURL,则可以执行curl_getinfo ($ch, CURLINFO_EFFECTIVE_URL)处所述: http : curl_getinfo ($ch, CURLINFO_EFFECTIVE_URL)

例:

<?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;
?>

您需要对上述网址执行http请求,并检查您获得的响应标头。 301302响应表示它是重定向。 重定向URL包含在响应标头中 ,其外观类似于Location: <url>

更新:手册提供了一个有用的示例 ,我从中整理了这个示例 ,它似乎可以工作:

<?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>'));
?>

这并不容易。

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

标头重定向。

在这里,您需要输入“ gimmiemypage.php”,而不是发送“ 200-OK”作为状态,而是发送“ 30?-Redirected”标头(其中?是1或2)。 这真的很容易检测,因为卷曲会告诉您。 欢呼。

HTML刷新重定向。

在这里,您在解析后使用和一秒钟,浏览器会向前转发您。

这很难检测到,因为您必须专门查找元标头,因此您需要解析任意HTML( 不要使用正则表达式,否则会很不好 )以找到这些标记。 它们应该始终位于,但是那些古怪的karazee网站开发人员可能会将其隐藏。

然后是Javascript重定向。 在不评估javascript的情况下查找这些内容几乎是不可能的。 您可以使用多种不同的方法来重定向JS中的人员,但是可以使用解析器来捕获人员。 但是,由于这是JS,您最终需要阅读和评估页面上可以看到的所有JS,随附的JS,以及所有包含...的内容。

我的建议是尝试找到一种并不意味着您需要了解所有重定向的方法,因为这是一个很深的陷阱。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM