如果我有一个URL(例如http://www.foo.com/alink.pl?page=2),我想确定我是否被重定向到另一个链接。我也想知道最终的网址(例如http://www.foo.com/other_link.pl)。
我想知道如何在PHP中执行此操作
谢谢大家的帮助:)
(更多信息:
我希望有一个名为doesItDirect($ url)的函数,如果为true,则返回重定向到的url,如果为false则返回相同的url
)
答案 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请求并检查您获得的响应标头。 301或302响应意味着它是重定向。重定向网址包含在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,以及任何包含...的内容......
我的建议是尝试找到一种并不意味着你需要了解所有重定向的方法,因为它是一个非常深入的好处。