php

PHP ile SEF Link Yapın Ve Kullanın

Merhaba arkadaşlar,

Bugün SEO’nun-arama motoru optimizasyonu- vazgeçilmezi olan arama motoru dostu link yapımını veya bunun da orjinal adıyla söylemek gerekirse SEF link yapımını göreceğiz. Şimdi makale, haber veya ürün bilgilerini tuttuğunu tablonuzda bir sütun daha oluşturun. Bu sütuna `sef` adını verin. Artık tablonuzda makale, haber veya ürün başlıklarınızın SEF halinide tutabileceğiniz bir sütununuz var. Bundan sonra yeni makale eklerken başlıklarınızın SEF halinide ekleyeceksiniz.

Bu makale ile neler öğreneceksiniz?

  • Girilen bir başlığı SEF Link’e çeviren PHP fonksiyonunu
  • .htaccess dosyasında RewriteEngine, RewriteBase ve RewriteRule
  • .htaccess dosyasının SEF link işlemlerinde nasıl kullanıldığını
  • deneme.com/deneme-baslik-1.html adresinin aslında deneme.com/makale_oku.php?sef=deneme-baslik&id=1 sayfası olduğunu ama bunu son kullanıcının asla anlamadığını ve bu işlemin nasıl yapılacağını öğreneceksiniz.

Şimdi sizlere PHP’de kullanacağımız fonksiyonu veriyorum:

/**
 * sef_link()
 *
 * Basliklari SEF linke çevirme fonksiyonu
 *
 * @param mixed $s
 * @return
 */
function sef_link($string)
    {
        $turkce=array("ş", "Ş", "ı", "ü", "Ü", "ö", "Ö", "ç", "Ç", "ş", "Ş", "ı", "ğ", "Ğ", "İ", "ö", "Ö", "Ç", "ç", "ü", "Ü");
        $duzgun=array("s", "s", "i", "u", "u", "o", "o", "c", "c", "s", "s", "i", "g", "g", "i", "o", "o", "c", "c", "u", "u");
        $string = str_replace($turkce, $duzgun, $string);
        return strtolower(trim(preg_replace('~[^0-9a-z]+~i', '-', html_entity_decode(preg_replace('~&([a-z]{1,2})(?:acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i', '$1', htmlentities($string, ENT_QUOTES, 'UTF-8')), ENT_QUOTES, 'UTF-8')), '-'));
}

Bu fonksiyon aracılığıyla başlıklarınızı sef hale getirebilirsiniz. Örnek vermek gerekirse “C++ Ders 1: Bir programın yapısı” başlığını “c-ders-1-bir-programin-yapisi” şekline çevirelim.

// Sadece id, başlık ve sef'i insert ediyoruz
$baslik="C++ Ders 1: Bir programın yapısı";
$sef=sef_link($baslik);

mysql_query("INSERT INTO makale(id, baslik, sef) VALUES(NULL, '$baslik', '$sef')");
// id sütunumuz auto-increment olduğu için NULL yazdık

Şimdi veritabanına giriş yaptık. Şimdi .htaccess dosyamızı oluşturalım. Htaccess dosyası sayesinde makale_oku.php diye oluşturacağımız dosyayı gizleyip onu SEF halde görmemizi sağlayacak. Bunun için .htaccess dosyasında RewriteEngine diye bir motor çalıştıracağız. Şimdi başlayalım hemen .htaccess dosyasına:

RewriteEngine On
RewriteBase /
RewriteRule ^([a-zA-Z0-9-_]+)-([0-9]+).html$ /makale_oku.php?sef=$1&id=$2

Şimdi .htaccess dosyamızda yazdıklarımızı açıklayalım. RewriteEngine’i On yaparak linklerimizin görünümünü değiştirmemizi sağlayan motoru aktifleştirdik. Daha sonra RewriteBase ile anadizinimizi belirledik. Son satırdaki RewriteRule ile yaptığımız işlem tam olarak şu:
– Eğer adres satırı ([a-zA-Z0-9-_]+)-([0-9]+).html yapısını sağlıyorsa bu sayfanın makale_oku.php dosyasını açmasını sağlıyor.
– Daha sonra $1 olarak ilk değişken kısmını alır. Bizim $1‘e karşılık gelen kısmımız ([a-zA-Z0-9-_]+) kısmıdır.$2 kısmına denk gelen kısım ise ([0-9]+) kısmıdır.
Yani deneme.com/deneme-baslik-1.html sayfası aslında deneme.com/makale_oku.php?sef=deneme-baslik&id=1 sayfasını çalıştırıyor. Fakat son kullanıcılar bunu asla farkedemezler. Şimdi makale_oku.php sayfamızı düzenleyelim:

// deneme.com/deneme-baslik-1.html adresine girmiş olalım
$sef = $_GET["sef"];
$id = $_GET["id"];

$vt_kontrol=mysql_fetch_assoc(mysql_query("SELECT * FROM makale WHERE id=$id AND sef='$sef'"));

if(!$vt_kontrol){
	echo "404 - sayfa bulunamadı" ;
}
else{
	echo $vt_kontrol["baslik"];
}

Bu kadar basit arkadaşlar, sef link bu şekilde yapılmaktadır. Umarım işinize yarar, sorularınızı forumdan veya aşağıdaki yorum formu aracılığıyla iletebilirsiniz.
Kolay gelsin,

Post Author: Oral ÜNAL

Web geliştirmeyi başta meslek olarak hayal eden fakat daha sonra bir hobi haline getiren birisiyim işte.

PHP ile SEF Link Yapın Ve Kullanın” için 10 yorum

  • phpci_cocuk

    (05 Mart 2012 - 03:27)

    Benim linklerim de deneme.com/makale_oku.php?sef=deneme-baslik&id=1 şeklinde yalnız ben bu linkleri :

    deneme.com/deneme-baslik-1.html şeklinde değilde:

    deneme.com/deneme-baslik.html şeklinde göstermek istiyorum. Aslında bunu id kısmını kontrol ettirmeden:

    $vt_kontrol=mysql_fetch_assoc(mysql_query(\”SELECT * FROM makale WHERE sef=\’$sef\’\”)); şeklinde yapabiliriz. Ama bu şekil bir kullanım doğru olurmu?İlerde bi problem çıkarır mı?Hem mysql sorgusunu:

    $vt_kontrol=mysql_fetch_assoc(mysql_query(\”SELECT * FROM makale WHERE id=$id AND sef=\’$sef\’\”));

    şeklinde kullanıp hemde:

    deneme.com/makale_oku.php?sef=deneme-baslik&id=1 şeklindeki linki:

    deneme.com/deneme-baslik.html şekline (id görünmeden)

    nasıl getirebiliriz?Çalışmalarınızda başarılar…

  • Seçkin Başköy

    (16 Aralık 2012 - 00:33)

    Merhaba,

    Bu seflink meselesini ben burada anlattığınıza benzer şekilde çözdüm ben ancak,
    anlamak istediğim şey şu peki kullanıcı kötü niyetliyse ve bizim sistemde kullandığımız değişkeni
    bir şekilde keşfedip istek yaparsa nasıl kontrol edeceğiz?

    Örnek

    linkimiz index.php?id=1 olsun htaccess dosyamız sayesinde linki 1-deneme-icerik.html haline getirdiğimizi varsayalım. Ve sistem bu sayfayı getirebiliyor olsun.

    Peki adam direkt olarak index.php?id=1 yazarsa ne yapacağız?

    • Oral ÜNAL

      (16 Aralık 2012 - 00:56)

      Şöyle düşünelim birde;

      Sen gerekli güvenlik önlemlerini aldıktan sonra kötü niyetli kişi zaten birşey yapamaz. Ayrıca PHP ile adresi kontrol edersin. İçinde “.php” geçen bir adres yakalarsan otomatik olarak 404 sayfasına yönlendirirsin olur biter ;)

      • Seçkin Başköy

        (20 Aralık 2012 - 10:10)

        Sorumun cevabı bu değil, ya da ben anlatamadım. Uzantısı php olmasına gerek yok siteniz zaten muhtemelen ya index.php ya da default.php adı ile yayında. Ve http://www.alanadiniz.com/?id=121 gibi bir adresle herhangi bir içeriğiniz görüntülenebilir. Ben de diyorum ki bunu yazdığında içerik çıkmadan önce headerı düzeltme imkanı yok mu? (Ya da yanlış ifade ettiysem kusura bakmayın, adres satırını kendiliğinden düzelten bir kod nasıl yazılabilir)

        Örneğin adam direkt olarak ?id=xxx gibi bir istekle geliyorsa bunu seflink olarak yeniden header location yapma imkanı yokmudur?

      • Oral ÜNAL

        (21 Aralık 2012 - 01:51)

        Hmmm anladım, bulunduğun sayfanın url’sini bir değişkene ata ve onu parse_url ile parçala. Daha sonra domainden sonrasını kontrol ederek istediğini elde edebilirsin ;) Üstteki mesajımda yine bunu açıklamaya çalışmıştım

  • Alican

    (29 Ocak 2013 - 21:13)

    Merhaba, değerli bilgiler içn teşekkür ederim. dediklerinizi harfiyen uyguladım ve gerçekten ne kadar basit olduğunu anlamış oldum.:) bunun için teşekkürler..

    fakat aklıma takılan ve çözümünü hala bulamadığım bir sorum olacak..

    .htaccess dosyası içine

    RewriteEngine On
    RewriteBase /
    RewriteRule ^([a-zA-Z0-9-_]+)-([0-9]+).html$ /makale_oku.php?sef=$1&id=$2

    yazılarını yazdık, ve bu kodları sadece makale_oku.php için yaptık, peki diğer bölümler için nasıl yapmalıyız, örnek: haberler.php – yazilar.php, dosyalar.php için nasıl bir işlem uygulamalıyız?

    RewriteRule ^([a-zA-Z0-9-_]+)-([0-9]+).html$ /makale_oku.php?sef=$1&id=$2 bu koları kopyalayıp, sadece makale_oku.php bölümünü haber_oku.php ile değişip eklediğimde de sonuc alamıyorum.

    ne yapmamız gerekiyor? vereceğinzi cevaplar için şimdiden teşekkür ederim..

  • Ahmet Pekin

    (10 Mart 2013 - 13:18)

    Öncelikle bu güzel makale için size ne kadar teşekkür etsem az kalır. Nette bulabildiğim en açıklayıcı konu bu bence. Birşey sormak istiyordum benim linkim bu şekilde

    http://www.site.net/makale_oku.php?id=1&sef=cok-komik-bir-video

    fakat ben bunun başına birde hangi kategori ise onuda yazdırmak istiyorum yani istediğim link tipi şu

    http://www.site.net/komik/cok-komik-bir-video.html

    Veritabanından kategoriyi falan da çektim linki yukarıdaki gibi hazırladım onda sorun yok ama .htaccess kısmının içinden çıkamadım.

    Yardımcı olursanız minnettar olurum. Çalışmalarınızda başarılar..

  • Ahmet Pekin

    (10 Mart 2013 - 13:21)

    Afedersiniz bir yanlışlık olmuş istediğim link

    http://www.site.net/komik/1-cok-komik-bir-video.html

    yani id de almak istiyorum

  • yasin

    (12 Temmuz 2016 - 14:15)

    ben bu olayı yapamadım yardımcı olma sansınız var mı acaba ?

    • Oral ÜNAL

      (27 Temmuz 2016 - 21:32)

      Merhaba,

      Yapamadım derken ne problem karşılaşıyorsun?

Yorum yazma sırası sizde!