PHPがリダイレクトURLを取得するいくつかの方法

2529 ワード

開発中にURL 301または302のリダイレクトが頻繁に発生する場合があります.リダイレクト後のurlを取得する必要がある場合があります.次に、リダイレクトurlを取得する方法について説明します.
1、get_でheaders関数phpに付属するget_Headers関数は、サーバがHTTPリクエストに応答して送信したすべてのヘッダを取得することができ、この関数で実装しようとすることができます.
function get_redirect_url($url){
   $header = get_headers($url, 1);
   if (strpos($header[0], ’301′) !== false || strpos($header[0], ’302′) !== false) {
     if(is_array($header['Location'])) {
       return $header['Location'][count($header['Location'])-1];
     }else{
       return $header['Location'];
        }
   }else {
     return $url;
   }
 }

2、fsockopen()内蔵関数を使う
function get_redirect_url($url){
   $redirect_url = false;
   $url_parts = @parse_url($url);
   if (!$url_parts) return false;
   if (!isset($url_parts['host'])) return false;
   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.1\r
”; $request .= ‘Host: ‘ . $url_parts['host'] . “\r
”; $request .= “Connection: Close\r
\r
”; 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; } }

3、cURL関数を使う
function get_redirect_url($url, $referer=”, $timeout = 10) {
   $redirect_url = false;
   $ch = curl_init();
   curl_setopt($ch, CURLOPT_URL, $url);
   curl_setopt($ch, CURLOPT_HEADER, TRUE);
   curl_setopt($ch, CURLOPT_NOBODY, TRUE);//        
   curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);//         
   curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
   curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
   curl_setopt($ch, CURLOPT_HTTPHEADER, array(
      ‘Accept: */*’,
      ‘User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)’,
      ‘Connection: Keep-Alive’));
   if ($referer) {
     curl_setopt($ch, CURLOPT_REFERER, $referer);//  referer
   }
   $content = curl_exec($ch);
   if(!curl_errno($ch)) {
     $redirect_url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);//       url  
   }
   return $redirect_url;
}

どの方法の効果がもっと高いか、自分でテストしてもいいです.