PHP ile Kısaltılmış URL’i Eski Haline Çevirme

17 Ekim 2018 tarihinde Emre Can ÖZTAŞ tarafından paylaşıldı.

URL kısaltma, 2002 yılında TinURL tarafından geliştirilen bir yapı. Aslında bir yapı demek doğru olmaz. Çünkü yapılan iş şöyle; geliştirilen bir algoritma ile uzun URL yapısını analiz edip daha kısa bir formata çevirmek. Siz de kendi oluşturacağınız bir algoritma ile URL kısaltma işlemini yapabilirsiniz. Lakin burada bir sorun var; algoritma sadece size özel olacağı için uzun URL yapısını bir yerde saklamanız gerekmektedir. Kısaltılmış URL yapısı da bu saklı olan URL yapısını işaret etmelidir. Etmelidir ki uzun URL’in gösterdiği adrese gidebilsin.

Bu formatın iyi kötü yanları var, tabi ki bu kaçınılmaz bir gerçek. En basit örnek; Twitter kendi URL kısaltma algoritmasını kullanmaktadır. Bunun nedeni de uzun URL yapısıyla kaybedeceğiniz karakter sayısını en aza indirmek.

Kısaltılmış URL yapısını açmak kafa karıştırıcı olabilir. Çünkü uzun URL yapısı, URL kısaltma servisinde ve algoritmayı yalnızca onlar biliyor gibi düşünebilirsiniz. Bu tamamen doğru. Lakin herhangi bir programlama dilinde yazacağınız basit bir kaç satır ile uzun URL yapısına ulaşmak mümkün.

Kısa formattaki URL yapısının asıl formunu almak için: HTTP-Request yapılmalıdır. Yani bu adrese bir istek gönderilmelidir. Daha sonra da dönen HTTP-Headers kısmı okunmalıdır. HTTP – Headers kısmında istek yapılan site ile ilgili tüm bilgiler yer almaktadır. Gördüğünüz gibi oldukça basit bir işlem.

Öncelikli olarak TinyURL servisinden; kendi kısalttım. Sonuç aşağıdaki gibidir.

https://tinyurl.com/ycrtdwxa

Basit olarak PHP ortamında get_headers() metodunu kullanarak siteme ait olan header bilgisini alıyorum.

get_headers('https://tinyurl.com/ycrtdwxa');

Yukarıdaki satırımızı bir değişkene bağlamamız daha doğru olacaktır. Şimdi
sonuca bir bakalım.

Array ( 
   [0] => HTTP/1.1 301 Moved Permanently 
   [1] => Date: Wed, 23 Oct 2019 11:14:59 GMT 
   [2] => Content-Type: text/html; charset=UTF-8 
   [3] => Connection: close 
   [4] => Set-Cookie: __cfduid=d66894e4ffa41ce66cd890d69370b06a91571829298; expires=Thu, 22-Oct-20 11:14:58 GMT; path=/; domain=.tinyurl.com; HttpOnly 
   [5] => X-Powered-By: PHP/7.3.9 
   [6] => Location: https://emrecanoztas.com/ 
   [7] => Cache-Control: max-age=0, no-cache, private 
   [8] => Set-Cookie: tinyUUID=db036386303e5f05fd590000; expires=Mon, 21-Oct-2024 11:14:59 GMT; Max-Age=157680000; path=/; domain=.tinyurl.com 
   [9] => Set-Cookie: TCSR-693d5094e08d7a100eda057d10f2ed4b=eyJpdiI6IlRaMTdveTRjMDQ3aERsWDdKUXJUMVE9PSIsInZhbHVlIjoieDJTQVZ2dHBlTXVteldJa21LYkNKdz09IiwibWFjIjoiYWFhMTIxZjA4ZDY2OTZlZjg4MzJlODJhMDZlNDI2YTBiMmM1MzM1ZDVmZWY0NjMzYTdhOGUzMDUzYWUxNzU4OCJ9; expires=Wed, 23-Oct-2019 11:19:59 GMT; Max-Age=300; path=/; domain=.tinyurl.com 
   [10] => Strict-Transport-Security: max-age=31536000; includeSubDomains; preload 
   [11] => CF-Cache-Status: DYNAMIC 
   [12] => Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct" 
   [13] => Server: cloudflare 
   [14] => CF-RAY: 52a34a5e5ac7da1e-IST 
   [15] => HTTP/1.0 200 OK 
   [16] => Content-Type: text/html; charset=UTF-8 
   [17] => Retry-After: 86400 
   [18] => Content-Length: 2350 
   [19] => Date: Wed, 23 Oct 2019 11:14:53 GMT 
   [20] => Accept-Ranges: bytes 
   [21] => Server: LiteSpeed 
   [22] => Connection: close 
)

Gördüğünüz gibi 6’nci indekste kısaltılmış olan URL’in uzun formu bulunmaktadır. Bu şekilde kısaltılmış bir URL’in uzun formuna
ulaşabilirsiniz.

PHP ortamında; get_headers() metodu oldukça yavaş çalışmaktadır. Eğer sürekli işlem yapacaksanız sistem bir süre sonra yorulacak ve yanıt vermemeye başlayacaktır. Bunun yerine cURL kullanmamız daha mantıklı bir seçim olacaktır. Çünk cURL, get_headers() metoduna göre çok daha hızlı çalışmaktadır. Öyleyse biz de kodlarımızı yeniden düzenleyelim ve cURL ile HTTP – Headers bilgisini alalım.

cURL kullanmadan önce; sisteminizde cURL’un kurulu olduğuna dikkat etmelisiniz. Bunu anlamanın en basit yolu da aşağıdaki gibi;

function_exists('curl_version');

curl_version kontrolü yapmaktır. Yukarıdaki değeri return() yaparsanız veya ekrana yazdırmak isterseniz; bool (true) veya bool (false) şeklinde bir mesaj alacaksınız.

cURL ile efektif bir şekilde kısaltılmış URL’in asıl formunu alalım. cURL ile yazacağımız satırlar aşağıdaki gibi olacaktır.

$url = 'https://tinyurl.com/ycrtdwxa'; 

$curl = curl_init($url); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); 
curl_setopt($curl, CURLOPT_HEADER, TRUE); 
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, FALSE); 
$response = curl_exec($curl); 

curl_close($curl);

Yukarıdaki satırlarımız da basit olarak; cURL ile basit bir istek yaptık ve dönen değeri de $response değişkenine atadık.

$response değişkenini de ekrana yazdırmak istersek; aşağıdaki sonuç ile karşılaşacağız.

HTTP/1.1  301  Moved  Permanently Date: Wed, 17 Oct 2018 08:58:47 GMT Content-Type: text/html; charset=UTF-8 Transfer-Encoding: chunked Connection: keep-alive Set-Cookie: cfduid=d3bbc272fee1d2991a3ad96cf2651b4db1539766727; expires=Thu, 17-Oct-19 08:58:47 GMT; path=/; domain=.tinyurl.com; HttpOnly Set-Cookie: tinyUUID=bc6f9cc534f158e3fad30000; expires=Thu, 17-Oct-2019 08:58:47 GMT; Max-Age=31536000; path=/; domain=.tinyurl.com Location: https://emrecanoztas.com/ X-tiny: cache 0.008432149887085 Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn- cgi/beacon/expect-ct" Server: cloudflare CF-RAY: 46b190bc8cb6bf70-AMS

Location kısmında da görüldüğü gibi uzun URL belirtilmektedir. Şimdi işin içine biraz daha sihir katalım ve regex’leri kullanarak sadece Location kısmını alalım. Bunun için de aşağıdaki kodları yazmamız yeterli.

preg_match_all('/^Location:(.*)$/mi', $response, $expanded_url);

$expanded_url değişkenine Location bilgisi olan satırı aldık. Sonuç aşağıdaki gibi olacaktır.

Array ( 
   [0] => Array ( 
       [0] => https://emrecanoztas.com/ ) 
       [1] => Array ( 
          [0] => https://emrecanoztas.com/ 
       ) 
)

Elimizde artık bir dizi değişkeni var. Bunu da aşağıdaki gibi alalım ve olay kapansın.

$url_format= $expanded_url[1][0];

$url_formatt değişkeni string bir yapıda ve uzun URL formunu içeriyor. Böylelikle; kısa formda olan URL yapısını uzun forma çevirdik.

Kodlarımızın son hali aşağıdaki gibi olacaktır.

$url = 'https://tinyurl.com/ycrtdwxa'; 

$curl = curl_init($url); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); 
curl_setopt($curl, CURLOPT_HEADER, TRUE); 
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, FALSE); 
$response = curl_exec($curl); curl_close($curl); 

preg_match_all('/^Location:(.*)$/mi', $response, $expanded_url); 
$url_format= $expanded_url[1][0]; 
echo($url_format);

Burada dikkat etmenizi istediğim küçük bir nokta var. Eğer bir URL bir servis üzerinden kısa forma çevrilmişse ve kısaltılmış bu URL başka bir servis tarafından yeniden kısa forma çevrilmişse; yukarıdaki kodlar sizi bir önceki servis tarafından kısaltılan adrese götürecektir. Bunun için yukarıdaki kodlarımızda yaptığımız istekten dönen sonucu tekrar istek yapmanız gerekir. Yani doğru bir sonuca ulaşmak için en az 2 kere URL’i genişletme işlemine tabi tutmalısınız.

Kategoriler: [PHP] Etiketler: #php-curl #tiny-url

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*

*
*

This site uses Akismet to reduce spam. Learn how your comment data is processed.