İçeriğe geç

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

URL kısaltma, 2002 yılında TinyURL 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, tabiki 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 web adresimi 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, 17 Oct 2018 07:46:01 GMT
    [2] => Content-Type: text/html;</code> charset=UTF-8
    [3] => Connection: close
    [4] => Set-Cookie: __cfduid=d15411b65a80deeabd9f15d9f47e18c241539762360; expires=Thu, 17-Oct-19 07:46:00 GMT; path=/; domain=.tinyurl.com; HttpOnly
    [5] => Set-Cookie: tinyUUID=bc6e8be1108e58e3fad30000; expires=Thu, 17-Oct-2019 07:46:01 GMT; Max-Age=31536000; path=/; domain=.tinyurl.com
    [6] => Location: http://emrecanoztas.com/
    [7] => X-tiny: db 0.012022018432617
    [8] => Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
    [9] => Server: cloudflare
    [10] => CF-RAY: 46b126235e129c95-AMS
    [11] => HTTP/1.1 200 OK
    [12] => Server: nginx
    [13] => Date: Wed, 17 Oct 2018 07:46:01 GMT
    [14] => Content-Type: text/html; charset=UTF-8
    [15] => Connection: close
    [16] => Vary: Accept-Encoding
    [17] => Link: ; rel="https://api.w.org/", ; rel=shortlink
    [18] => X-Frame-Options: SAMEORIGIN
    [19] => X-XSS-Protection: 1; mode=block
    [20] => X-Content-Type-Options: nosniff
    [21] => X-Nginx-Cache-Status: EXPIRED
    [22] => X-Server-Powered-By: Engintron
)

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: http://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, $expandedURL);

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

Array
(
    [0] => Array
        (
            [0] => Location: http://emrecanoztas.com/
        )

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

)

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

$urlFormat = $expandedURL[1][0];

$urlFormat 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.

<?php

$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, $expandedURL);
$urlFormat = $expandedURL[1][0];

echo($urlFormat);

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.

Kısaltılmış URL yapısını asıl formuna çeviren betiğin kodlarını buradan inceleyebilir ve buradan indirebilirsiniz.

Saygı ve muhabbetle!

Bu içeriği paylaşmak ister misiniz?

İlk Yorumu Siz Yapın

Bir cevap yazın

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

Buradaki içeriklerin tümü kamu malıdır. Kullanılması ve paylaşılması özgürdür.