Kişisel bir web günlüğü

Yönlendirilmiş olan en son adresi PHP ve cURL ile tespit etmek

phpBirçok web adresi çeşitli nedenlerden dolayı, bir başka web adresine yönlendirilmiş olabiliyor. Örnek vermek gerekirse "sitebilgi.com" adresi "www.sitebilgi.net" adresine yönlendirilmiştir. Eğer böyle bir web adresinden veri çekeceksek, öncelikli olarak yönlendirilmiş olan bu en son web adresini (efektif adres) tespit etmemiz gerekiyor.

normal yoldan tespit yöntemleri

1) Önceki yazılarımdan birinde PHP'nin yerleşik get_headers fonksiyonundan bahsetmiştim. Bunu kullanarak yönlendirilmiş olan adresi bir yere kadar tespit edebiliyorsunuz ama bu fonksiyon oldukça yetersiz kalıyor.

2) get_headres fonksiyonu yetersiz kaldığı için çareyi cURL kütüphanesinin fonksiyonlarında arayabilirsiniz. Bu kütüphanenin curl_getinfo fonksiyonunu CURLINFO_EFFECTIVE_URL ve CURLOPT_FOLLOWLOCATION seçenekleriyle beraber kullanarak yönlendirilmiş en son adresi alabilirsiniz.

"enson_url" fonksiyonu ile tespit yöntemi

Bazı durumlarda maalesef üstte bahsettiğim her iki yöntemi de kullanamıyorsunuz. Örneğin 1. yöntemdeki "get_headers" fonksiyonu bazı web adresine bağlanamıyor. Çünkü bağlantı için bazı ekstra başlık (header) bilgileri göndermeniz gerekebiliyor. Böyle durumlarda bu fonksiyon çuvallıyor. Mesela www.r10.net adresine bu fonksiyonla bağlanamıyor ve "HTTP request failed" hatası alıyorsunuz.

  1. <?php
  2.     // bu kodlarla "HTTP request failed" hatası alırsınız
  3.  
  4.     $headers = get_headers('http://r10.net');
  5.  
  6.     echo '<pre>';
  7.     print_r($headers);
  8.     echo '</pre>';
  9. ?>

Hemen aklınıza 2. yöntemdeki gibi cURL kütüphanesini kullanmak gelebilir fakat bazı hosting sağlayıcıları cURL kütüphanesini etkinleştirmiş olsalar bile CURLOPT_FOLLOWLOCATION seçeneğini güvenlik nedeniyle kapatmış olabiliyorlar (benim başıma 2-3 kez geldi). Bundan dolayı ben de ismini enson_url olarak belirlediğim ve kapatılmış olması en düşük ihtimalli cURL seçeneklerini kullanarak bir fonksiyon yazdım. Yazdığım kodlar aynen aşağıdaki gibidir ve ayrıca enson_url.html sayfasında da aynı kodları bulabilirsiniz.

  1. <?php
  2.  
  3. /**
  4. * Yönlendirilmiş olan bir web adresinin,
  5. * en son yönlenmiş olduğu web adresini bulur.
  6. *
  7. * eBurhan ~ 7 Ağustos 2009 ~ www.eburhan.com
  8. */
  9. function enson_url($eskiUrl, $max=5, $i=0)
  10. {
  11.     // maksimum kaç adet yönlendirilmiş adres
  12.     // takip edilecek onun kontrolünü yapıyoruz
  13.     if( $max === $i ) {
  14.         return $eskiUrl;
  15.     }
  16.  
  17.     $ch  = curl_init();
  18.     curl_setopt($ch, CURLOPT_URL, $eskiUrl);
  19.     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  20.     curl_setopt($ch, CURLOPT_HEADER, true);
  21.     curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3);
  22.     curl_setopt($ch, CURLOPT_NOBODY, true);
  23.     curl_setopt($ch, CURLOPT_REFERER, $_SERVER['HTTP_REFERER']);
  24.     curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
  25.     curl_setopt($ch, CURLOPT_VERBOSE, false);
  26.     curl_setopt($ch, CURLOPT_NOPROGRESS, true);
  27.     $headers = curl_exec($ch);
  28.     curl_close($ch);
  29.  
  30.     // yönlendirilMEmiş ise URL'yi aynen geri yolla
  31.     if( preg_match('/Location: (.*)/i', $headers, $location) === 0 ) {
  32.         return $eskiUrl;
  33.     }
  34.  
  35.     // yönlendirilmiş olan sayfayı veya adresi al
  36.     // sayfanın önünde '/' var karakterleri varsa bunları sil
  37.     $yeniUrl = preg_replace('/^\/+/', '', trim($location[1]));
  38.  
  39.     // yeni adresin başında bir http(s) eki yoksa
  40.     if( preg_match('|^(https?://)|', $yeniUrl, $matches) === 0 ) {
  41.         $eskiUrl = parse_url($eskiUrl);
  42.         $eskiUrl = $eskiUrl['scheme'].'://'.$eskiUrl['host'].'/';
  43.         $yeniUrl = $eskiUrl.$yeniUrl;
  44.     }
  45.  
  46.     return enson_url($yeniUrl, $max, $i++);
  47. }
  48.  
  49. ?>

Bu fonksiyon kısaca, web adresinin başlık bilgilerine bakıyor ve bu bilgiler arasında "Location" ifadesi olup olmadığını tespit ediyor. Bu ifade varsa bundan yararlanarak yönlendirilmiş olan yeni web adresine geçiş yapıyor. En fazla kaç defa geçiş yapacağını da siz belirleyebiliyorsunuz. Fonksiyonu şöyle kullanabilirsiniz:

  1. <?php
  2.  
  3.     $ilk_url = 'http://hepsiburada.com';
  4.     $son_url = enson_url($ilk_url, 5);
  5.  
  6.     echo $son_url;
  7.    // "http://www.hepsiburada.com/default.aspx?nc=1" döndürecektir
  8.  
  9. ?>

7 Ağustos 2009, 15:33 Programlama Bugün 8 kez, toplamda ise 2.952 kez okundu. , , ,
7 yorum var
  1. Teşekkürler hocam.

  2. Owww, bot’um bir yönlendirme yüzünden birkaç gün önce çalışmaz hale gelmişti. İşte bu benim kurtarıcım. Nasıl da denk geldi… :) Çok teşekkür ediyorum!

  3. Tecrübe dedikleri bu olsa gerek. :) Teşekkürler.

  4. Sanırım bu yöntem javascript yönlendirmeyi de delip geçiyor ?

  5. @omer
    bu yöntem javaScipt ile veya meta-refresh etiketiyle yapılan yönlendirmeleri kapsamıyor.

  6. Gerçekten Çok güzel ve mantıklı bir script sağolasın Eburhan…:)

  7. Ellerine Sağlık Erhan

İçinizde kalmasın, siz de yorum yazın

Telif Hakkı © 2010 eburhan.com | Structure | XHTML