/** * Get_redirect_url () * Gets the address that the provided URL redirects, * Or FALSE if there's no redirect. * * @ Param string $ url * @ Return string */ Function get_redirect_url ($ url ){ $ Redirect_url = null; $ Url_parts = @ parse_url ($ url ); If (! $ Url_parts) return false; If (! Isset ($ url_parts ['host']) return false; // can't process relative URLs If (! Isset ($ url_parts ['path']) $ url_parts ['path'] = '/' $ Sock = fsockopen ($ url_parts ['host'], (isset ($ url_parts ['port'])? (Int) $ url_parts ['port']: 80), $ errno, $ errstr, 30 ); If (! $ Sock) return false; $ Request = "HEAD". $ url_parts ['path']. (isset ($ url_parts ['query'])? '? '. $ Url_parts ['query']: '')." HTTP/1.1rn "; $ Request. = 'host: '. $ url_parts ['host']. "rn "; $ Request. = "Connection: Closernrn "; Fwrite ($ sock, $ request ); $ Response ='' While (! Feof ($ sock) $ response. = fread ($ sock, 8192 ); Fclose ($ sock ); If (preg_match ('/^ Location: (. + ?) $/M', $ response, $ matches )){ Return trim ($ matches [1]); } Else { Return false; } } /** * Get_all_redirects () * Follows and collects all redirects, in order, for the given URL. * * @ Param string $ url * @ Return array */ Function get_all_redirects ($ url ){ $ Redirects = array (); While ($ newurl = get_redirect_url ($ url )){ If (in_array ($ newurl, $ redirects )){ Break; } $ Redirects [] = $ newurl; $ Url = $ newurl; } Return $ redirects; } /** * Get_final_url () * Gets the address that the URL ultimately leads. * Returns $ url itself if it isn't a redirect. * * @ Param string $ url * @ Return string */ Function get_final_url ($ url ){ $ Redirects = get_all_redirects ($ url ); If (count ($ redirects)> 0 ){ Return array_pop ($ redirects ); } Else { Return $ url; } } |