Apache URL Rewriting ve PHP ile SEO uyumlu URL üretimi

Apache URL Rewriting ve PHP ile SEO uyumlu URL üretimi

Url rewriting SEO ile ilgilenenler için önemli bir konu. SEO uyumlu adresler SEO için onlarca gerekli düzenlemeden sadece biri.

Url rewriting konusuna uzak olanlar için kısaca açıklayalım:
Url rewriting kısaca adresleri istediğimiz gibi değiştirip takla attırmamıza yarar.
URL rewriting örnekleri:

anasayfa => anasayfa.php
anasayfa.html => anasayfa.php
anasayfa/10 => anasayfa.php?id=10
anasayfa/gundem/10/ => gundem/anasayfa.php?id=10
anasayfa/gundem/10/haber-basligi => gundem/anasayfa.php?id=10

Yukarıdaki örneklerden en alttaki SEO uyumlu bir URL'dir. Çünkü adres haber başlığını içeriyor. Bizim yapacağımız SEO uyumlu bir örnek yapmak olacak.

Url Rewriting işlemini daha kolay yapabilmek için Regular Expression kullanmak daha akıllıca. Fakat Regular Expression hiç bilmeyenler aşağıdaki liklerden öğrenebilirler.

- http://httpd.apache.org/docs/2.0/misc/rewriteguide.html
- http://regexlib.com/

Her şeyden önce Apache sunucusunda Url Rewrite yapabilmek için Apache'nin rewrite modülüne göre derlenmemiş ise derlememiz ve ufak bir ayar yapmamız gerek.

Derleme işlemi (Default olarak rewrite modülü derlenmiştir) :
Derleme işlemi sonucunda mod.rewrite.so adında bir dosya oluşuyor. Bu dosya bizim modülümüzün çalışması için gerekli.
Apache'yi rewrite modülüne göre derlemek için -enable-rewrite=shared -enable-spelling= shared -enable-status= shared parametrelerini eklenerek derleme işleminin yapılması gerek.

Modülü aktif etme işlemi:

Apache'nin ana dizininde httpd.conf dosyasında modülü aktif etmek için aşağıdaki satırları bulun;

#LoadModule rewrite_module modules/mod_rewrite.so
#AddModule mod_rewrite.c

İlk satır modülü yüklerken ikinci satır modülü aktif hale getiriyor. Satırların başında varsa '#' karakterlerini kaldırıp dosyayı kaydedin ve Apache sunucunuzu restart edin.

Rewrite Modülünü kullanma işlemi:

Apache virtual host kullandığından web yöneticilerinin kendilerine has özellikler yaratabilmesine olanak verir. Bunu yapabilmek için web sayfanızın ana dizininde text editör ile .htaccess adında bir dosya oluşturup rewrite işlemini yapacak kodumuzu yazmaya başlayalım. ( not: '#' karakteri comment yani yorum yapmamıza yarar)

Örnek 1:

anasayfa => anasayfa.php şeklinde bir url rewrite yapabilmek için aşağıdaki kodumuzu yarattığımız .htaccess dosyasına yazıp kaydedelim.

#rewrite motoru çalıştırılyor
RewriteEngine On
# anasayfa ile başlayan bir sayfa istenirse anasayfa.php dosyasını çağırıyoruz ve kuralı regular expression ile uyguluyoruz
RewriteRule ^anasayfa/? anasayfa.php [NC,L]
[NC,L] komutları birer flag'dır. 'NC' adresin case insensititve olmasını sağlar. 'L' ise rewrite kuralı uygulanırsa başka bir kuralın geçerliliğini kaldırır.

Örnek 2:

anasayfa/10 => anasayfa.php?id=10
RewriteEngine On
RewriteRule ^anasayfa/(\d+)/? anasayfa.php?id=$1 [NC,L] 
Burada (\d+) 1, 10, 100 gibi sayıları temsil eden değerleri almamıza yarıyor. Parantez içinde bulunan değerler otomatik olarak sırasına göre $1'e, $2'e, $3'e... kaydediliyor. Fakat bu öreneğimizde sadece bir tane değişken kullanığımız için $1 bizim için yeterli. Alınan sayıyı id değişkene eşitleyip adresimizi üretiyoruz. Bunu da Regular Expression kullanarak yaptık.
/? ise adresin sonuna '/' karakteri koyulup koyulmadığını kontrol eder ve her iki durumuda kabul eder.

Örnek 3:

anasayfa/gundem/10/ => gundem/anasayfa.php?id=10

RewriteEngine On
RewriteRule ^anasayfa/\w+/(\d+)/? gundem/anasayfa.php?id=$1 [NC,L] 

\w+/ 'gundem' değerini temsil ediyor.
(\d+) ve $1 '10' değerini temsil ediyor.

Şimdi SEO uyumlu URL adresimizi yaracağımız RewriteRule yazalım.
Örnek 4:

anasayfa/10/haber-basligi.html = > anasayfa.php?id=10

RewriteEngine On
RewriteRule ^anasayfa/(\d+)/\w+/? anasayfa.php?var1=$1 [NC,L]
(\d+) ve $1 '10' değerini temsil edecek. \w+ 'haber-basligi.hmtl' değerini temsil edecek.
Bir başka SEO uyumlu URL rewrite örneği:

Örnek 5:

anasayfa/gundem/10/haber-basligi => anasayfa.php?type=$1&id=$2

RewriteEngineOn
RewriteRule ^anasayfa/(\w+)/(\d+)/\w+/? anasayfa.php?var1=$1&var2=$2 [NC,L]
(\w+) ve $1 'gundem' değerini temsil edecek.
(\d+) ve $2 '10' değerini temsil edecek.

Örnek 6:
Şimdi aşağıdaki adreslerin hepsini değiştirebilecek RewriteRule yazalım:

anasayfa/gundem/10/haber-basligi => gundem/anasayfa.php?id=10
anasayfa/10/haber-basligi.html => anasayfa.php?id=10
anasayfa => anasayfa.php

RewriteEngineOn
RewriteRule ^anasayfa/(\w+)/(\d+)/\w+/?anasayfa.php?type=$1&id=$2 [NC,L]
RewriteRule ^anasayfa/(\d+)/\w+/? anasayfa.php?id=$1 [NC,L] 
RewriteRule ^anasayfa/? anasayfa.php [NC,L]
Burada dikkat etmemiz gereken kuralları sırasıyla koymak. Çünkü uygulanan her kural diğerinin çalışıp çalışmayacağını etkiliyor. En iyi yöntem karmaşıktan basite doğru alt alta sıralamak.

Rewrite modülü bu şekillde kullanılabiliniyor. Bu kuralları tabiki geliştirmek mümkün.

Php ile SEO uyumlu adresler yaratma (6. örnekten devam ):

Şimdi SEO uyumlu adreslerimizi link olarak yaratmamız gerekiyor.
Mesela haber başlığını otomatik olarak SEO uyumlu adrese dönüştürecek fonksioyonu PHP ile yazmaya başlayalım.
Yapacağımız iş oldukça basit.
Örnek:

Ömür Uzatan Evler => omur-uzatan-evler
Şemsi Efendi Pasajı = > semsi-efendi-pasaji
Bilinmeyen **. Dünyalar = > bilinmeyen-dunyalar

Türkçe ve '*' gibi özel karakter içeren başlıkları düzeltmemiz gerek.

function url_baslik_yarat ($baslik="")
{ 

 //değiştirelecek türkçe karakterler
 $TR=array('ç','Ç','ı','İ','ş','Ş','ğ','Ğ','ö','Ö','ü','Ü');
 $EN=array('c','c','i','i','s','s','g','g','o','o','u','u');
 //türkçe karakterleri değiştirir
 $baslik= str_replace($TR,$EN,$baslik);
 //tüm karakterleri küçüklür
 $baslik=mb_strtolower($baslik,'UTF-8');
 // a'dan z'ye olan harfler, 0'dan 9 a kadar sayılar, tire (-), 
 // boşluk ve altçizgi (_) dışındaki tüm karakteri siler
 $baslik=preg_replace('#[^-a-zA-Z0-9_ ]#','',$baslik);
 //cümle aralarındaki fazla boşluğü kaldırır
 $baslik=trim($baslik); //cümle aralarındaki
 boşluğun yerine tire (-) koyar
 $baslik= preg_replace('#[-_ ]+#','-',$baslik); 
 
 return $baslik;
 }
 
Yukarıdaki url_baslik_yarat fonksiyonu sadece (omur-uzatan-evler) gibi bir başlık oluşturmak için kullacağız. Url adresinin kalan kısmını
(ör: anasayfa/10/omur-uzatan-evler.html ) oluşturmak için başka bir fonksiyon yazalım:
function full_url_yarat  ($id, $baslik,  $type="")
{
  //type bilgisi varsa uygun url üretilir
  if ($type!="") 
   return sprintf('anasayfa/%s/%s/%s.html',$type,$id,url_baslik_yarat($baslik));
  else
   return sprintf('anasayfa/%s/%s.html',$id,url_baslik_yarat($baslik));
}
 
Bu fonksiyonu kullanarak 2 farkli link oluşturalım:
 <html><head></head>
	<body>
	 <?php
	 $link1=full_url_yarat(10,"ŞemsiEfendiPasajı",'gundem');
	 $link2=full_url_yarat(11,"Bilinmeyen**.Dünyalar!!");
	 //yaratılanlinkleriekranalinkolarakgösteriyoruz.
	 echo"<ahref='\"".$link1."\"'link1.="\" >".$link1."</a>";
	 echo"<ahref='\"".$link2."\"'link2.="\" >".$link2."</a>; 
  ?> 
  </body> 
 </html> 
Yazdığımız bu php kodlarını anasayfa.php olarak kaydedip internet tarayacımızda çıktısına bakalım:

SEO url text

Linklere tıklandığında id ya da type değerlerini alıp almadığını kontrol eden anasayfa.php sayfamızı basitçe oluşturalım.(RewriteRule kısmında anasayfa.php diye belirtmiştik) id ve type değerlerini adres satırında göderdiğimiz için bu değerleri GET metodu ile alacağız. Eğer çalışırsa aynı zamanda Url Rewriting kodlarımız da çalışmış demektir.
anasayfa.php kodumuz:
   
        //yarattığımız URL'deki verileri alıp ekrana bastırıp kontrol edelim.
	  if(isset($_GET['id']))
	   echo'id:'.$_GET['id'].'<br>';
      if (  isset ( $_GET['type'] ) ) 
       echo 'type: '.$_GET['type'];


İlk linkte ve ikinci linke tıklağımda çıkan sonuç:

seo url sonuç

Yaptığımız örnekte dikkatinizi başlığın sunucu tarafında hiçbir işlem yapılmadığı olabilir fakat bunun gibi başlıklar arama motorları için anlamlı bir durum.
PHP ile SEO uyumlu Url oluşturma bu şekilde yapılabilir. Siz de kendinize göre uygun başlıklar içeren adresleri Php ile bu teknikle yapabilirsiniz.

Uygulama ile ilgili tüm dosyaları buradan indirebilirsiniz.
yazan Zülküf Küçüközer tarih   1st August 2009
primary key words  Url rewriting | Php | Seo | Apache okunma  25681
secondary key words  Seo optimizasyon | Url | Rewrite | Rewriterule
writing ali kavak writing 20th October 2010
tşkler elinize sağlık epey faydası dokundu bana
writing klima servisi writing 10th November 2010
Gerçekten çok kaliteli bir anlatım olmuş elinize sağlık
writing Alpexcalibur writing 6th December 2010
Merhaba , Bnim bir sorum olucak sitemde ihtiyacım olan rewrte kodunu uyguladım ve bağlantılar hatasız olarak çalıştı Fakat herhangi bir bağlantıya tıklayınca
writing Alpexcalibur writing 6th December 2010
adres çubuğunda linklere verdiğim permalinkler değilde parametreli hali görünüyor. Bunu nasıl düzeltebilirim.
writing emre writing 19th January 2011
merhabalar id yi belirmeden id üzerinden bilgiyi çeksek.yani kısacası id yi göstermeden id li işlem yaptırsak olurmu
writing Bar?? writing 21st January 2011
Çok teşekkürler.
writing BaGc?lar Profilo Servisi writing 22nd January 2011
Harika bir sonsuz teşekkür ederim
writing zülküf küçüközer writing 31st January 2011
Merhaba emre, id kullanmadan yazıyı getirmek için yazı başlığını id gibi kullanman gerekebilir.
writing klima servis writing 16th March 2011
Faydalı anlatım için teşekkür ederiz.
writing kombi servisi writing 3rd June 2011
Oldukca başarılı bir makale emekleriniz için teşekküler faydalı olacagından kesin eminim :)
writing vrf klima writing 22nd June 2011
Anlatım için teşekkürler.
writing Havana NYX writing 30th July 2011
php dışında htaccess ile nasıl yapabiliriz bu konuda da bilgi verirmisiniz ?
writing web tasar?m izmir writing 24th June 2012
Bir projem için bunu arıyordum güzel bir paylaşım olmuş çok teşekkürler...
writing ozan writing 9th October 2013
hocam gerçekten aradigimi buldum dedigim anlardan birini yasiyorum :D gerçekten çok tesekkür ederim sayende ögrendiim :)
writing tunc writing 13th June 2014
Hocam test icin dosyayi calistirdim. linklere tiklatinca sayfa bembeyaz acilior $_GET ile gelen giden bir veri yok neden olabilir acaba ?