Permalink

- 7 Kasım 2006

Bir sorun ve kullanım amaçlı bir bilgi olarak zoque`de açtığım bir topic üzerine konu hakkında yazılmış çeşitli kaynakları birleştirerek bir yazı oluşturmam gerektiğini farkettim.
Konumuz permalink yani kullanıcı dostu bağlantı olarak da çevirebileceğimiz ve çoğu yerde kalıcı, anlamlı, kullanıcı dostu anlaşılabilir bağlantı olarak da görebileceğimiz bir terim.


Permalink sistemi çoğunlukla blog sistemlerinde kullanılmaktadır. Fakat artık her cms (içerik yönetim sistemi)`de de kullanıcılara sunulmakta.

Ancak son zamanlarda arama motoru optimizasyonlarında, özellikle Google`ın subdomain ve url içeriğinde aranılan konularla ilgili terimlerde yaptığı sonuç sıralamasında büyük fark oluşturduğunun gözlenmesi ile genel olarak kullanılmaya başlanmıştır.

Birçok blog dağıtımından, hazır olarak bulundurulan sistemlerden örneklendirmek gerekir ise;

Blogspot

http://<kullanıcıadı>.blogspot.com/<4karakterliyıl>/<2karakterliay>/<konuadı>.html

WordPress

http://<site-belirli ön ek>/<4karakterliyıl>/<2karakterliay>/<zaman>/<konuadı>/

* biçimlerinde sunulmaktadır.

Biz varolan hazır sistemlerin dışında kendiniz bu işlemi nasıl uygularsınız buna gelelim.

Bu işlem Apache üzerinde sunucunuzda bulunan .htaccess adlı bir dosya ile yapılmaktadır. Ancak zoque`de de belirtildiği üzere bu işlem için sadace Apache ve .htaccess yeterli değildir.

Bu işi yapan modülün adı mod_rewrite`tır ve Apache`nin hem 1.3 hem de 2.0 sürümlerinde desteklediği önemli bir mod eklentisidir. Bu mod kurulu değilse veya Apache bu mod ile birlikte derlenmemişse, haliyle burada anlatılanlar da çalışmıyor olacaktır. *

Diyelim ki http://www.domain.com/details.php?id=5&baslik=Başlığımız şeklindeki url`mizi http://www.domain.com/5/Başlığımız haline çevirmek istiyoruz.

Burada dikkat etmemiz gereken url kısmında boşluk kullanamayacak olmamızdır. Burada bir kaç alternatifimiz var. “_, -, +” gibi karakterlerle boşluğun yerini doldurmamız ve arama motorlarında sonuçlandırma işleminde başarılı olmamız gerekiyor.

Ayrıca diyelim ki adresinizin RSS işlemi ile başlıklarını feed url`leri tutan ve bünyesinde sunan program/site`lerde de görünsün istiyorsunuz. O halde burada çok titiz davranmak gerekiyor.

İlgili sayılabilecek bir not: Eğer arama motoru optimizasyonu (SEO) için de biraz katkısı olsun istiyorsan _ yerine - kullanmanı tavsiye ederim. Bir yerde duyduğuma göre _ ile birleştirilen kelimeler tek bir kelime gibi anlaşılıyormuş arama motorları tarafından. Gerçi günümüzdeki robotlar bunu anlamayacak kapasitede değil ama olsun şahsi fikrimce - karakteri _ karakterine göre daha hoş duruyor. *

Çeşitli arama sonuçlarını karşılaştırdığımızda en fazla sonunu + veriyor, sonrasında - ve _ geliyor. + URLENCODING olduğundan url satırında %2B haline dönüşüyor. Boşluk karakteri de %20 haline dönüştüğünden bu iki karakteri de kullanamıyoruz. Tek alternatifimiz ise - olarak kalıyor.

Şimdi işlemlerimize geçelim;

http://www.domain.com/details.php?id=5&baslik=Başlığımız şeklindeki linkimizi
http://www.domain.com/5/Başlığımız şeklinde göstermek ve işlemek için sql ile çektiğimiz kayıtlarımızı ufak bir düzenlemeden geçirerek bazı karakterleri ayıklamalıyız. PHP`de hazırladığım ufak bir kod ile türkçe karakterlerde dahil birkaç karakteri temizliyorum.

  1. $bulunacak = array(”`”,”,”,”ç”,”ı”,”ş”,”ğ”,”ü”,”ö”,”Ğ”,”Ş”,”Ç”,”Ö”,”Ü”,” “,”!”);
  2. $degistir = array(”",”",”c”,”i”,”s”,”g”,”u”,”o”,”G”,”S”,”C”,”O”,”U”,“-”,”");
  3. $onarilmis = str_replace($bulunacak, $degistir, $cekilensatir);
  4. $onarilmis = URLencode(htmlentities($onarilmisr,ENT_QUOTES));

PHP ile linki bu şekilde düzenledikten sonra link içerisinde boşluk içeren kısımları -`a çevirdik. Şimdi .htaccess düzenlemesi ile son işlemlerimizi de halledelim.

  1. Options
  2. RewriteEngine on
  3. RewriteBase /
  4. RewriteRule ^([A-Za-z0-9]+)/([A-Za-z0-9\_]-)/?$ detail.php?id=$1&baslik=$2

Yukarıdaki kodu açıklamak gerekirse;

RewriteEngine on ile sunucuya anlamlı link tekniğine başladığımızı söylüyoruz.

RewriteRule ile sonrasında belirli karakter kodlamalarını adres ile değiştirip gerekli işlemi başlatmış oluyoruz.
Bizim yazdığımız kodda;
http://www.domain.com/?id=5&baslik=Başlığımız bu olsun
Şeklinde iki adet değer bölümümüz bulunuyor. id ve baslik. Bunların aldıkları değerleri / le böleceğimiz için aldıkları değerleri parselemeliyiz. ^([A-Za-z0-9]+) ile id değerimiz yani $1 değişkeninin karakter kodlamasını alıyoruz. id değerimiz sadece sayısal/integer ifade ise 0-9 olması yeterlidir. Bu şekilde birinci parseleme işlemini halletmiş oluyoruz. Aynı şekilde ikinci parse alanında da bu işlemi yapıyoruz. Ancak birinciden farklı olarak bu defa - karakterini de için içine dokmalıyız ki urlmizde boşlukları - olarak işleme koyabilelim.

Sonrasında detail.php dosyasından sonraki kodları parselemiş ve bunu da .htaccess`a açıklamış oluyoruz.

Bu işlemi ISAPI filterlar sayesinde Windows Server`da yapmak için;
domain.tld/product.asp?id=123
domain.tld/product/123
domain.tld/product/123.html
domain.tld/product/123.htm

Not-2: URL Rewrite sadece URL yazmak için değil , aynı zamanda spider yönlendirme, emailextractor koruması sub domain yönlendirmesi…vs.vs. gibi bir çok faydalı işe yaramakta. *

Kaynaklar;

Wikipedia / Permalink
URL Encoding
PHP.net
Apache

Yazı Kategorisinden Son Yazılar

“Permalink” için 25 Yorum

  1. Umut Şirin diyor ki:

    vallaha işte bu : )
    harika içerikli bir yazı olmuş ellerine sağlık demekten kendimi alamıyorum :)

  2. Ceyhun AKSAN diyor ki:

    Teşekkürler Umut.
    Arama motorları ile ilgili hazırladığım makale ile bu konunun devamını da getireceğim fırsat bulduğumda.

  3. Ceyhun AKSAN · Arama Motoru Optimizasyonu diyor ki:

    [...] Buradaki makalemde bu konuya satır aralarında kısaca değinmiştim.

  4. Harika siteler sitesi Sunipeyk blog’ u :: Permalink :: July :: 2006 diyor ki:

    [...] Bu işlem için yapmanız gereken PHP, .htaccess düzenlemeleri… Daha ayrıntılı bilgi… [...]

  5. miL diyor ki:

    Bigiler için teşekkürler

  6. Engin diyor ki:

    Peki permalinki Windows serverda yapmamızın bir şansı var mı acaba?

  7. Ceyhun AKSAN diyor ki:

    Engin
    ASP ile hazırlamak için mi yoksa php ile windows server`da kullanmak için mi belirtmemişsin ancak ben sana konu ile alakalı olarak şu ve şu adresleri önereceğim.

  8. Ceyhun AKSAN - Görsel İletişim & Grafik Tasarım · Arama Motoru Optimizasyonu diyor ki:

    [...] AKSAN - Görsel İletişim & Grafik TasarımTamamlanmamış Makaleler « Permalink  •  TÜM YAZILAR  •  Mandabatmaz [...]

  9. yasebo diyor ki:

    ben php-fusion için kullanmak istiyorum..

    $bulunacak = array(”`”,”,”,”ç”,”ı”,”ş”,”ğ”,”ü”,”ö”,”Ğ”,”Ş”,”Ç”,”Ö”,”Ü”,” “,”!”);
    $degistir = array(””,””,”c”,”i”,”s”,”g”,”u”,”o”,”G”,”S”,”C”,”O”,”U”,“-”,””);
    $onarilmis = str_replace($bulunacak, $degistir, $cekilensatir);
    $onarilmis = URLencode(htmlentities($onarilmis,ENT_QUOTES));

    bu kodu biraz daha açarsanız sevinirim.. :(

  10. Ceyhun AKSAN diyor ki:

    yasebo
    bu konuyla ilgili daha farklı kullanım örnekleri için php manuel`i inceleyebilirsin.

  11. yasebo diyor ki:

    hocam bi sürü yazı yazdım soldaki kutuları doldurmadan göndere tıklamısım hepsi silindi ya çok kötü oldu simdi o kadar seyi yazmaya üsendim..
    söyle anlatayım

    hocam sorunum türkçe karakter,

    URLencode(htmlentities($onarilmis,ENT_QUOTES));

    bunu yaptıgımda ise linkteki türkçe karakterler;
    “Beğendiğim”
    “Beðendiðim”
    seklinde oluyor urlencode yapmadıgım zaman

    ” ş ğı ” bu karakterleri yazdıgımda değişmiyor hatta hiç bişey cıkmıyor ” Þ ð ý ” bu karakterleri yazınca değiştiriyor,

    yardım ederseniz çok sevinirim

  12. Ceyhun AKSAN diyor ki:

    yasebo
    Karakter kodlaman nedir acaba?

  13. yasebo diyor ki:

    budur hocam

    iso-8859-9
    ama
    windows-1254 denedim
    yine aynı

    simdi ben ” Þ ð ý ” bu sekle razıyım tamam, ama üst tırnak olan başlıklar acılmıyor..

    yani link bu sekil görüneceğine
    ..forum/43_27_Yasebo’nun-dikkatine.html
    bu şekil görünüyor..
    ..forum/43_27_Yasebo#39;nun-dikkatine.html

    :S

  14. index.php?s=123 yerine ne kullanilabilir? - Zoque.Forum diyor ki:

    [...] kullanilabilir? Forum i

  15. Ceyhun AKSAN diyor ki:


    1. $bulunacak = array("`", ",", "ç", "ı", "ş", "ğ", "ü", "ö", "Ğ", "Ş", "Ç", "Ö", "Ü", " ", "!", "?", "\"", "’", "'");
    2. $degistir = array( "", "-", "c", "i", "s", "g", "u", "o", "G", "S", "C", "O", "U", "-", "", "", "", "", "");
    3. $onarilmis = str_replace($bulunacak, $degistir, $cekilensatir);
    4. $onarilmis = URLencode(htmlentities($onarilmisr,ENT_QUOTES));

    bu şekilde kullanabilirsin.

  16. index.php?s=123 yerine ne kullanilabilir? - Zoque.Forum diyor ki:

    [...] ne kullanilabilir? Forum i

  17. onur gunduz diyor ki:

    bir ruby örneğiyle katkıda bulunmak gerekirse :)

    string = Iconv.iconv(’ascii//ignore//translit’, ‘utf-8′, str).to_s
    string.gsub!(/\W+/, ‘ ‘).gsub(/\ +/, ‘-’)

  18. Ceyhun AKSAN diyor ki:

    Çok teşekkürler Onur

  19. onur gunduz diyor ki:

    ah bir typo -_-

    string.gsub!(/\W+/, ‘ ‘).gsub!(/\ +/, ‘-’)

  20. onur gunduz diyor ki:

    ceyhun yazı harika biz teşekkür ederiz :x

  21. Sinan Gedik diyor ki:

    Sitemdeki script hazır script oLmamakLa birLikte. Seo konusunda biraz geLiştirmek istiyorum. Bunun içinde İçerik yazıLarımın LinkLerinin

    http://sitem.com/icerik.php?id=354 iken Htaccess iLe http://sitem.com/icerikbasligi.html şekLinde gözükmesini istiyorum..
    Scriptte baslik?> komutu iLe içerik başLığı sayfaya yazdırılıYor.

    Ayrica http://sitem.com/kategori.php?cid=11 halinde oLan linkleride
    http://sitem.com/kategorismi.html şeklinde göstermek istiyorum..
    kategori);?> komutu ile kategori ismi sayfaya yazdırılmakta..

    Ayrıca title kısmında da kategori ismi gozuksun istiyorum. php bilgim olmadığımdan kategori ismine title a nasıl yazdırırım..

    Peki elimdekiLerLe nasıl bir htaccess dosyası ile bu dediğimi yapabiLirim.. Htaccess dosyasını yaptıktan sonra bunu nasıl siteme yansıtabiLirim.. Link verme kodu açısından..

    Sitem: http://www.karabukrehberi.com

  22. Mehmet diyor ki:

    Merhabalar,
    http://www.ismimis.com/asd/10 şeklideki kullanımda bir sorun yok.
    Ancak linkte başlıkta boşluk yerinde - (eksi) karakterini kullanmak istiyorum. Kullandığım zaman da sayfa görüntülenemiyor.

    Bunu nasıl düzeltiriz….

    RewriteEngine on
    RewriteBase /
    RewriteRule ^([A-Za-z0-9]+)/?$ index.php?id=$1
    RewriteRule ^([A-Za-z0-9]+)/([A-Za-z0-9\_]+)/?$ index.php?id=$1&baslik=$2
    RewriteRule ^([A-Za-z0-9]+)/([A-Za-z0-9\_]+)/([A-Za-z0-9\_]+)/?$ index.php?id=$1&baslik=$2&s=$3

  23. sinan diyor ki:

    teşekkürler, gerçekten faydalı olmuş.

  24. Halil diyor ki:

    Merhaba, yazı gerçekten çok faydalı. Ben de takıldığım bir sorunu sormak istiyorum. Mümkünse cevaplarmısınız?

    ReWriteRule ^([a-z0-9_-]+)/([0-9]+)$ index.php?ulke_id=$1&s=$2&sayfa=ulkeler [L,NC]

    kodu ile ,

    http://www.siteadi.com/Turkiye veya
    http://www.siteadi.com/Turkiye/3 veya
    http://www.siteadi.com/Turkiye/3/ şeklinde gelen url’leri alıyorum. Fakat
    http://www.siteadi.com/Turkiye/ şeklinde gelen url’leri alamıyorum.
    Kafaya taktım bunu :) Nasıl çözebilirim acaba bu durumu ?

  25. memurdostu diyor ki:

    blogspotta yapabilirmiyiz bu dediğinizi?

Yorum Yapın