Apache Rewrite İpuçları

Apache rewrite modülü gerek SEO için, gerekse kullanıcıların adres kısmında gördükleri url’nin anlamlı olması açısından faydalı bir modül. Aslında rewrite’ın kabiliyetleri o kadar geniş ki bunun dışında bir sürü iş için de kullanılabiliyor.

Bu yazıda onlara çok değinmeyeceğim, benim değineceğim kısım çalışma şekli ile ilgili 1-2 kritik nokta. Bu noktalar rewrite ile ilgili sorunlarınızı çözmede çok işinize yarayacak…

RewriteLog

En sık yaşanan sorun, yazdığınız rewrite’ın çalışmaması ve bunun nedenini anlayamamak. Bunun için yapmanız gereken aşağıdaki satırları konfigürasyon dosyanıza, rewrite tanımlarının üstüne eklemek:

Bunu yaptığınız zaman her bir http request için rewrite sırasında neler yapıldığı satır satır yazılır. Açıkçası biraz fazla satır yazılıyor, üşenmeden okumak gerek…

Loglevel’ı düşürerek (2, 3  yaparak) daha az satır yazılmasını sağlayabilirsiniz ama tabii bu sefer de daha az bilgi olduğu için detaylar kaçabilir. O kısmı deneme yanılma ile çözersiniz.

Unutmayın, her bir request için log yazılır. Dolayısıyla örneğin bir rewrite kuralı yazdınız, sayfa geliyor ama CSS’ler gelmiyor. Bunu test etmek için sayfayı değil o CSS dosyasını açın yoksa sayfada yüklenen tüm imajlar, css’ler, javascript dosyaları için aynı log’lar düşeceğinden okumakta zorlanabilirsiniz.

Bir diğer ipucu da, her bir denemeden önce dosyanın içeriğini silebilirsiniz, böylece önceki denemenin satırları kafanızı karıştırmaz. Ne de olsa rewrite log saklanması gereken bir log değil, işiniz bitince kapatacaksınız nasıl olsa. (Evet, işiniz bitince kapatmayı unutmayın, boşu boşuna sunucuyu yorar çünkü).

RewriteRule ve RewriteCond

Rewrite kuralının belirli kurallara uyuyorsa çalışmasını istiyorsak RewriteCond kulanıyoruz. Özellikle framework’lerde bu çok tercih edilen bir yöntem. Örneğin:

Bu kuralda, eğer çağırılan adres seçtiğimiz dosya uzantılarına sahip değilse ve diskte de yoksa adresi index.php’ye yönlendiriyoruz.

Burada çok ince bir nokta var, onu belirtmek için bunları yazdım yoksa amacım RewriteRule örneği vermek değil…

Apache’de RewriteRule ve RewriteCond yazıldığı gibi değil ters sırayla çalıştırılır. Dolayısıyla üstteki kurallarda önce RewriteRule satırı çalışır, sonra RewriteCond 1. ve 2. satırlar çalışır.

Bu örnekte çok önemli değil ancak bu küçücük detay “neden çalışmıyorr uleaaan” diye saç baş yolmanıza neden olabilecek güçtedir (tecrübeyle sabittir).

Bu şekilde tasarlanmasının nedeni, RewriteRule’da parantez içinde yazdığınız kuralla yakaladığınız adresteki bir değeri RewriteCond içerisinde $1, $2 şeklinde kullanabilirsiniz. Kullanabilmeniz için de önce oradaki regular expression’ın çalışması gerekiyor tabii…

htaccess ile vhost’un farkı

İlginç bir şekilde bilgisi çok iyi olan birçok kişinin dahi bu iki dosya arasındaki farkı bilmediklerini sık sık görüyorum. Biliyorsunuz rewrite ve apache’deki diğer birçok ayar genel konfigürasyon dosyasından da htaccess’ten de yapılabilir.

htaccess pek önerilmez çünkü herhangi bir dizine bağlandığınız zaman apache o dizinden DocumentRoot’a kadar tüm dizinlerin altında .htaccess dosyası var mı diye bakar.

Örneğin www.huysuzadam.com/dir1/dir2/dir3/a.txt adresine girdiğiniz zaman apache 4 kere diske erişip .htaccess diye bir dosya var mı diye sorar bu da özellikle yük alan sitelerde performansa etki eder…

Genel konfigürasyon ya da vhost dosyalarında, <Directory> komutu içerisinde yazdığınız ayarlar aynı htaccess’teki gibi çalışır. Dolayısıyla htaccess’e yazdıklarınızı oraya yazabilirsiniz. Tabii bu dediklerim kendi sunucunuz varsa geçerli, hosting’lerde bu imkan olmuyor…

Rewrite htaccess ve vhost’ta Farklı Çalışır

1. Sonsuz Döngü

htaccess’teki RewriteRule çalıştıktan ve url’yi değiştirdikten sonra, son url’nin dizinindeki htaccess tekrar çalışır. Dolayısıyla eğer aynı dizine rewrite ettiyseniz sonsuz döngüyle karşılaşabilirsiniz.

Eğer alias yaptıysanız RewriteBase direktifi ile alias dizinini belirterek kurtulabilirsiniz. Genelde DocumentRoot altında ise projeniz, bu sıkıntı olmaz ancak komplike bir kuralda bu tarz bir problem yaşadığımı bilirim.

2. Dosya Path’i Relative / Absolute

RewriteCond’un -f, -d gibi komutlarıyla dosya var mı diye kontrol yapıyorsanız; htaccess’te bulunduğu dizine göre dosya var mı kontrolü yaparken vhost’ta dosyanın sistem root’una göre kontrol yapılır. Dolayısıyla htaccess’te:

olan komut vhost’ta:

gibi birşey olmalı, yoksa çalışmaz.

3. Path’deki ekstra /

htaccess’te test edilen url’nin başındaki dizin vs. RewriteRule’dan önce silinir, kuraldan sonra geri eklenir gibi bir yapısı var. Yani detayını çok da bilmiyorum açıkçası, yalan yok…

Ama sonuç olarak htaccess’ten erişirken test edilen adresin başında / yoktur, vhost olursa başta / olur. Çalışmayan birşey varsa loglardan bununla ilgili bir ipucu da arayabilirsiniz.

Sonuç

Sıfırdan rewrite kuralı çoğu kimse yazmıyor aslında, çok sık gerek olmuyor çünkü. Günümüzde framework’ler sıkça kullanıyor onun dışında dediğim gibi çok sık kullanılan bir şey değil.

Bu yüzden de genelde google’da arayıp deneme yanılma ile çözme yöntemi kullanılıyor… Burada verdiğim ipuçları ile bunların niye çalışmayacağı ile ilgili fikir yürütebilirsiniz.

Örneğin en sık yapılan hatalardan biri htaccess için yazılmış bir kuralı global konfigürasyona yazmak ya da tam tersi… En azından ikisinin farklı çalıştığını bilmek bile ciddi bir vakit kazandıracaktır.

1 Yorum

  1. Şu an itibariyle 24 saattir yaşadığım htaccess problemini aşmış bulunmaktayım. Nasıl mı ?
    Konuyu baştan aşağı okurken su satırlara geldim okumayı bırakarak uygulamaya koyuldum, problemin ne olduğunu ve nasıl çözüldüğünü bu satırlar gayet iyi anlatıyor…
    Sabit Olan Tecrübenizi Paylaştığınız İçin Teşekkür Ederim.
    “Burada çok ince bir nokta var, onu belirtmek için bunları yazdım yoksa amacım RewriteRule örneği vermek değil…

    Apache’de RewriteRule ve RewriteCond yazıldığı gibi değil ters sırayla çalıştırılır. Dolayısıyla üstteki kurallarda önce RewriteRule satırı çalışır, sonra RewriteCond 1. ve 2. satırlar çalışır.

    Bu örnekte çok önemli değil ancak bu küçücük detay “neden çalışmıyorr uleaaan” diye saç baş yolmanıza neden olabilecek güçtedir (tecrübeyle sabittir).”
    Tekrar Teşekkürler

    Reply

Leave a Comment.