Yönlendirilmiş olan en son adresi PHP ve cURL ile tespit etmek
Birç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.
-
<?php
-
// bu kodlarla "HTTP request failed" hatası alırsınız
-
-
$headers = get_headers('http://r10.net');
-
-
echo '<pre>';
-
print_r($headers);
-
echo '</pre>';
-
?>
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.
-
<?php
-
-
/**
-
* Yönlendirilmiş olan bir web adresinin,
-
* en son yönlenmiş olduğu web adresini bulur.
-
*
-
* eBurhan ~ 7 Ağustos 2009 ~ www.eburhan.com
-
*/
-
function enson_url($eskiUrl, $max=5, $i=0)
-
{
-
// maksimum kaç adet yönlendirilmiş adres
-
// takip edilecek onun kontrolünü yapıyoruz
-
if( $max === $i ) {
-
return $eskiUrl;
-
}
-
-
$ch = curl_init();
-
curl_setopt($ch, CURLOPT_URL, $eskiUrl);
-
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
-
curl_setopt($ch, CURLOPT_HEADER, true);
-
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3);
-
curl_setopt($ch, CURLOPT_NOBODY, true);
-
curl_setopt($ch, CURLOPT_REFERER, $_SERVER['HTTP_REFERER']);
-
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
-
curl_setopt($ch, CURLOPT_VERBOSE, false);
-
curl_setopt($ch, CURLOPT_NOPROGRESS, true);
-
$headers = curl_exec($ch);
-
curl_close($ch);
-
-
// yönlendirilMEmiş ise URL'yi aynen geri yolla
-
if( preg_match('/Location: (.*)/i', $headers, $location) === 0 ) {
-
return $eskiUrl;
-
}
-
-
// yönlendirilmiş olan sayfayı veya adresi al
-
// sayfanın önünde '/' var karakterleri varsa bunları sil
-
$yeniUrl = preg_replace('/^\/+/', '', trim($location[1]));
-
-
// yeni adresin başında bir http(s) eki yoksa
-
if( preg_match('|^(https?://)|', $yeniUrl, $matches) === 0 ) {
-
$eskiUrl = parse_url($eskiUrl);
-
$eskiUrl = $eskiUrl['scheme'].'://'.$eskiUrl['host'].'/';
-
$yeniUrl = $eskiUrl.$yeniUrl;
-
}
-
-
return enson_url($yeniUrl, $max, $i++);
-
}
-
-
?>
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:
-
<?php
-
-
$ilk_url = 'http://hepsiburada.com';
-
$son_url = enson_url($ilk_url, 5);
-
-
echo $son_url;
-
// "http://www.hepsiburada.com/default.aspx?nc=1" döndürecektir
-
-
?>
















Teşekkürler hocam.
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!
Tecrübe dedikleri bu olsa gerek.
Teşekkürler.
Sanırım bu yöntem javascript yönlendirmeyi de delip geçiyor ?
@omer
bu yöntem javaScipt ile veya meta-refresh etiketiyle yapılan yönlendirmeleri kapsamıyor.
Gerçekten Çok güzel ve mantıklı bir script sağolasın Eburhan…:)
Ellerine Sağlık Erhan