[英]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.