Apache Mod_Rewrite

 
 
 
 

Apache tabanlı hostlarda link yapısını düzenlemek için .htaccess dosyası vasıtasıyla Apache mod_rewrite modülü kullanılıyor.

Sistem basit iki temel üzerine kurulu; koşullar ve kurallar.

Eğer koşul belirtilmezse, kural direk çalışıyor. Koşul belirtildiğinde ise tahmin edeceğiniz üzere koşullarımız gerçekleşirse çalışıyor.

Koşul oluşturmak için RewriteCond  kural oluşturmak için ise RewriteRule  kullanılıyoruz.

Koşul Oluşturmak RewriteCond

Koşul oluştururken kullanabileceğimiz belli başlı operatörler var :

> Büyüktür :

Bildiğimiz büyüktür operatörü, soldaki değer sağdakinden büyükse koşul gerçekleşmiş sayılır. Sadece sayılarda değil metinlerde de kullanılabilir. Uzun olan metin büyük sayılır.

Kullanımı:

< Küçüktür :

Bu da bildiğimiz küçüktür operatörü, soldaki değer sağdakinden küçükse koşul gerçekleşmiş sayılır. Sadece sayılarda değil metinlerde de kullanılabilir. Kısa olan metin küçük sayılır.

Kullanımı:

= Eşittir :

Eşittir operatörü, iki taraf arasında eşitlik varsa yani soldaki değer ve sağdaki değer birbirine eşitse koşul gerçekleşmiş sayılır. Kullanımı:

Not : Operatörlerin başına ! karakteri koyarak koşulun tam tersini oluşturabilirsiniz.

Örneğin :  RewriteCond motor !=traktor şeklinde.

Not: Operatörlerin sağdaki değere değmesi soldakine değmemesi gerekiyor. Aksi taktirde sunucu hata verebiliyor.

Not:  Bu noktadan sonraki anlatımda regular expression yani kurallı ifadeler bilgisi gerekebilir. Kurallı ifadeler ile ilgili yazıma buradan ulaşabilirsiniz.

 

Server ve kullanıcı ile ilgili bilgiler veren bazı ifadeler var. Koşul oluştururken sürekli bu ifadeleri kullanmamız gerekecek. Kullanımı; %{İfade}

şeklinde. Örnek vermek gerekirse :

gibi. Bu ifadeler sadece koşul oluştururken değil, kural oluştururken de kullanılabiliyor. Buna daha sonra değineceğim.

HTTP_USER_AGENT ifadesi :

Tarayıcının user agent’ini verir. Örneğin :

Mozilla/5.0 (Windows NT 6.3; WOW64; rv:39.0) Gecko/20100101 Firefox/39.0

şeklinde bir sonuç döndürür.

Örnek Kullanım :

User Agent Mozilla/5.0 ile başlıyorsa koşul sağlanmış olur.

User Agent Firefox/39.0 İle bitiyorsa koşul sağlanmış olur.

 

User Agent Chrome/44 İçeriyorsa koşul sağlanmış olur.

HTTP_REFERER ifadesi :

Sayfaya nereden gelindiği bilgisini verir. Örneğin ahmetersin.org/disari-baglanti adresi üzerinden gelen ziyaretçinin HTTP_REFERER değeri http://ahmetersin.org/disari-baglanti şeklinde olacaktır.

Örnek Kullanım :

Sadece ahmetersin.org üzerinden gelen ziyaretçilerde koşul sağlanmış olur.

Aynı şekilde :

ahmetersin.org dışında herhangi bir site üzerinden gelen bütün ziyaretçilerde koşul sağlanır.

Hotlink koruması yani siteniz dışından gelenlere resimleri vs. kapatma işlemide bu şekilde bir koşul ile yapılıyor :

HTTP_COOKIE ifadesi :

Çerezleri okumaya yarar. Javascriptde ki document.cookie  ile aynı çıktıyı verir.

Örneğin kullanici_ad adinda bir çerezimiz olsun ve değeri de ahovanya olsun.

Sadece kullanici_ad çerezinin ahovanya değerini eşit olduğu durumlarda koşul sağlanmış olacaktır.

HTTP_HOST ifadesi :

Sitenin adresini verir. Örneğin :

http://www.localhost.com/deneme123/afafafa adresinde www.localhost.com sonucunu, http://localhost.com/deneme123/afafafa adresinde localhost.com sonucunu, http://localhost/deneme123/afafafa adresinde ise localhost sonucunu döndürür.

Kullanımı :

Sadece http://ahmetersin.org/ şeklinde başlayan adreslerde koşul sağlanmış olur.

Sitenin siteadresi.com şeklindeki versiyonunu www.siteadresi.com olarak değiştirme işlemide bu ifadeden faydalanılarak yapılıyor :

Buradaki [R] ifadesinin işlevinede birazdan değineceğim.

HTTP:header ifadesi :

Bu ifade http headerlerini kullanarak ifade oluşturmanıza olanak tanır.HTTP:header ifadesindeki headerin yerine herhangi bir http header’i yazarak kullanıyoruz.

Http headerlerinin ne olduğunu hakkında bilginiz yoksa  ->https://en.wikipedia.org/wiki/List_of_HTTP_header_fields

Örnek :

Şeklindeki ifadede eğer tarayıcının dili Türkçe ise koşul sağlanmış olur.

DOCUMENT_ROOT ifadesi :

Sitenin ana dizinin dosya yolunu verir. Mesela ben bilgisayarda Xampp kullandığım için verdiği çıktı, C:/xampp/htdocs şeklinde oluyor.

Aklıma herhangi bir örnek kullanım gelmediği için örnek vermeden atlıyorum bunu.

SERVER_ADDR ifadesi :

Kullanıcının ip adresini verir. Örneğin :

Sadece 192.168.1.175 ip’sine sahip birisi girdiğinde koşul sağlanmış olur.

SERVER_PORT ifadesi :

Kullanıcının bağlandığı portu verir. Web sayfalarında varsayılan olarak 80 portu kullanılır.

Kullanımı :

Sadece 80 portundan girildiğinde koşul sağlanmış olur.

REQUEST_METHOD ifadesi :

Http metodunu verir. GET ya da POST olarak 2 farklı sonucu vardır. Kullanımı :

Sadece Get metodu ile istek yapıldığında koşul sağlanmış olur.

REQUEST_URI ifadesi :

Adresin alan adından sonraki kısmını verir. Yani http://localhost/deneme/htaccess şeklindeki adresin /deneme/htaccess bölümünü verir.

THE_REQUEST ifadesi :

Http metodunu, protokolünü ve istek adresini verir. Örnek çıktı :

GET /denemeler/htaccess/c/ HTTP/1.1

REQUEST_FILENAME ifadesi :

Çalışan scriptin sunucudaki adresini verir. Yani http://localhost/deneme/takatuka.php şeklindeki script çalıştırıldığında REQUEST_FILENAME ifadesi C:/xampp/htdocs/deneme/takatuka.php şeklinde bir sonuç döndürür. SCRIPT_FILENAME alternatifi olarak kullanılabilir.

QUERY_STRING ifadesi :

Sorgu metnini verir. Yani http://localhost/deneme.php?sorgu=hayya-huyya şeklindeki adreste soru işaretinden sonraki kısımı yani sorgu kısımını verir, bu örnekteki vereceği değer sorgu=hayya-huyya olacaktır.

TIME_YEAR ifadesi :

Şu an içinde bulunduğumuz yılı verir. Kullanımı :

İçinde bulunduğumuz yıl 2015 den büyük ise koşul sağlanmış olur.

TIME_MON ifadesi :

Şu an içinde bulunduğumuz ayı verir. Kullanımı :

Sadece mart ayında yani 3. aydaysak koşul gerçekleşmiş sayılır.

TIME_DAY ifadesi :

Şu an içinde bulunduğumuz günü verir. Kullanımı :

Sadece ayın 10. gününden sonra koşul gerçekleşmiş sayılır.

TIME_HOUR ifadesi :

Şu an içinde bulunduğumuz saati verir. Kullanımı :

Sadece saatin 30. dakikasına kadar koşul gerçekleşmiş sayılır.

TIME_MIN ifadesi :

Şu an içinde bulunduğumuz dakikayı verir.

TIME_SEC ifadesi :

Şu an içinde bulunduğumuz saniyeyi verir.

TIME_WDAY ifadesi :

Haftanın kaçıncı gününde olduğumuzu verir.

TIME ifadesi :

Tarihi YılAyGünSaatDakikaSaniye biçiminde verir. Örnek çıktı:

20150805114147


 

Genel olarak ifadeler bu şekilde. Bir de dosyalarla ilgili kontroller yapmamıza olanak sağlayan ekler var :

-f eki :

Dosyanın olup olmadığını kontrol eder. Dosya varsa koşul sağlanır. Kullanımı :

Eğer adreste sayfa.php mevcut ise koşul gerçekleşmiş sayılır.

-d eki:

Dizinin olup olmadığını kontrol eder. Eğer dizin varsa koşul sağlanır. Kullanımı :

Adreste dizin adında bir klasör varsa koşul sağlanır.

-s eki :

İlk önce böyle bir dosyanın var olup olmadığına bakar. Eğer dosya varsa boyutuna bakar. Boyutu da 0 baytdan büyük ise koşul sağlanmış olur. Kullanımı :

Burada hata_kayit.log dosyası yoksa veya boşsa koşul gerçekleşmez. Eğer hata_kayit.log dosyası mevcutsa ve boyutu 0 baytdan büyük ise koşul gerçekleşmiş sayılır.

[NC] eki :

Büyük küçük harf duyarlılığını kapatır. Yani normalde ahmet =Ahmet birbirine eşit değil fakat koşulun sonuna [NC] yani No Case eklersek büyük küçük harf duyarlılığı ortadan kalkıyor.

Kullanımı :


 

RewriteCond genel olarak bu şekilde kullanılıyor. Birden fazla koşul kullanmak istediğimizde ise ve, ve ya bağlaçları kullanmamız mümkün.

Koşulların hepsi sağlanıyorsa kuralımızı çalıştırmak için koşulların hepsini alt alta yazmamız yeterli oluyor. Bu işlem programlama dillerindeki AND ile aynı görevi üstleniyor.

Örnek :

 Programlama dillerindeki OR(Ve ya) u kullanmak istersek, olsa da olur olmasa da olur tarzındaki koşulun sonuna [OR] ekliyoruz.

Sonunda [OR] ekli koşul altındaki koşul ile şey oluyor, kelimeye dökemedim ama şöyle göstereyim :

şeklindeki koşul; if ( (A OR B OR C) and D )  anlamına geliyor.

Örnek :

Kural Oluşturmak RewriteRule

Kurallı ifadeler hakkında bilginiz varsa RewriteRule ile kural oluşturken de hiç zorlanmayacağınız söyleyebilirim. Bu kısımı tanımla flan anlatamayacağım için bir örnekle açıklayım.

http://www.siteadresi.com/kullanici.php?ulke=turkiye&sehir=ankara&isim=ahmet&soyad=ersin şeklinde bir adresimiz olsun, bizde bu adresi http://www.siteadresi.com/turkiye/ankara/ahmet-ersin olarak değişitirmek isteyelim :

Şeklinde bir kod ile halletmemiz mümkün. Kurallı ifadelerdeki parantez ile yaptığımız gruplama, burada bir nevi değişken sayılıyor ve sırasıyla $1, $2,.. şeklinde kullanabiliyoruz.

Aynı şekilde, bu değişkenleri koşul oluştururken de kullanabiliyoruz :

Kurallardan elde ettiğimiz değişkenleri koşullarda kullanabildiğimiz gibi koşul oluştururken kullandığımız ifadeleri kurallarda da kullanabiliyoruz :

Kural oluştururken genel anlamda kullanılacaklar bunlar. Kurallı ifadeler hakkında da bilginiz varsa hemen her işinizi görmeniz mümkün. RewriteRule ile yapabileceğimiz bir kaç şey daha var, onlarada değinip yazıyı bitirmek istiyorum.

Yönlendirmeler :

301 Yönlendirmesi [R=301] : Kalıcı olarak yönledirme yapar, arama motorlarıda bu yönlendirmeyi dikkate alır. Htaccess dosyasından bu yönlendirmeyi kaldırsanız bile tarayıcı yönlendirmeyi yinede yapar, kalıcılığı tarayıcının hafızaya almasından ve arama motorlarınında bu yönlendirmeye göre davranmasından gelmekte. Kullanımı:

302 Yönlendirmesi [R=302] : Geçici olarak yönlendirme yapar, arama motorları pek dikkate almaz. Geçiciden kasıt htaccess dosyasından kodu sildiğinizde yönlendirme yapılmaz. Kullanımı:

 


Apache mod_rewrite hakkında benim bildiklerim bu kadar. Eksik ya da yanlış gördüğünüz bir şey olursa yazmaya üşenmeyin 🙂

 
 
 
 
  • alper

    20 Aralık 2015 04:13

    Ahmet ersin muthiş olmuş çok begendim. Baya bir kaynak gezdim fakat senin makalen hem anlaşılır hemde çok detaylı tbrler. Birde şu flagları açıklasan [L,QSA] gibi sona eklenen flagların anlamlarını.

    Cevapla

    • ahmet

      29 Aralık 2015 10:47

      Değerli yorumun için teşekkürler.
      QSA Query String Append ‘in kısaltması. Bu flag, get sorgularını da alabilmemizi sağlıyor. Basitce örneklemek gerekirse :
      http://ahmetersin.org/ornek/deger?sorgu=merhaba şeklinde bir adres olsun elimizde.
      Bunu RewriteRule ile herhangi bi flag olmadan kullandığımızda:
      RewriteRule ^ornek/(.*)$ /cikti-ver.php?gelen-veri=$1
      Bize sorguyu düzgün bir biçimde vermeyecektir. Yani aldığımız çıktı şu şekilde olacaktır :
      /cikti-ver.php?gelen-veri=deger ama QSA flag’ı ile kullandığımızda :

      RewriteRule ^ornek/(.*)$ /cikti-ver.php?gelen-veri=$1 [QSA] Çıktı da get sorgusu da gelecektir :
      /cikti-ver.php?gelen-veri=deger?sorgu=merhaba

      L ise last sözcüğünün kısaltması. Bu flag RewriteCond ile birlikte kullanılıyor.
      Amacı ise koşul gerçekleştiğinde hangi kurala kadar uygulanacağını belirlemek. Örnek vermek gerekirse :
      RewriteCond a =a
      RewriteRule ...
      RewriteRule ...
      RewriteRule...

      Burada koşul gerçekleştiğinde RewriteCond altında ki bütün kurallar çalışacaktır.
      Buna engel olmak için ise son kuraldan sonra L flag’ını eklemek yeterli:
      RewriteCond a =a
      RewriteRule ... [L]
      RewriteRule ...
      RewriteRule...

      Bu şekilde, koşul gerçekleştiğinde sadece birinci kural çalışacaktır. Umarım anlatabilmişimdir 🙂

      Cevapla

Yorum Gönder

Bilgi : E-posta Adresin Sadece İletişim için, kimsecikler görmeyecek.