[英]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请求,并检查您获得的响应标头。 301或302响应表示它是重定向。 重定向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.