Türker Öztürk

Apache mod_rewrite Kısa Notlar

Kullanıcı Oyu:  / 0
En KötüEn İyi 

mod_rewrite sayesinde, gelen url belirlediğimiz bir şablon kurala uyuyorsa, url nin görünüşünü değiştirebiliyor veya başka bir url olarak kullaınılmasını sağlayabiliyoruz. Bu da demek oluyor ki SEO işlemleri veya yeri değişen bir sayfayı talep eden istemciyi sayfanın yeni adresine otomatik yönlendirme yapabiliyoruz. Ayrıca mesela sitemizdeki grafik içeriklerin başka sitelerden direk link verilerek kullanılmasını da engelleyebiliyoruz.

Bu mod_rewrite halen başarılı olmuş olduğum bir konu değil. Ancak bu sefer apache.org sayfasındaki belgeyi okuyarak çalışma mantığını anladım, onu izah ediyorum bir de kısa kısa notasyon hakkında bilgiler veriyorum.

mod_rewrite şöyle çalışıyor:

Aslında http://httpd.apache.org/docs/current/images/rewrite_rule_flow.png resmine baksanız iyi olur akış diyagramı iyi anlatmış http://httpd.apache.org/docs/current/rewrite/tech.html sayfasındaki.

.htaccess dosyasında;

1. Her kural RewriteRule satırı ile başlar. URL önce sayfadaki ilk RewriteRule yazan satıra gelir. RewriteCond yazanlara gelmez.

2(no). RewriteRule yazısının yanındaki pattern, gelen URLnin biçimine uymuyorsa RewriteRule etkisizdir yani URLye birşey yapmaz ve işlem eğer varsa sonraki RewriteRule satırından devam eder.

2(yes). RewriteRule yazısının yanındaki pattern, gelen URLnin biçimine uyuyorsa RewriteRule etkilidir, yani URL satırın devamındaki substitution'da belirtilen biçime dönüştürülür ve satırın devamındaki [flags]'da belirtilen son işlemlere tabi tutulur. Örneğin L flag belirtilmişse URL alt satırlardaki diğer RewriteRule kurallarından devam etmez.

Peki RewriteCond nedir?

Her RewriteRule satırı üzerinde RewriteCond satırları olabilir veya olmayabilir. Varlarlasa, önce RewriteRule satırının pattern kısmına URL uyuyorsa, ondan sonra substitution biçimine dönüştürülmeden önce RewriteRule satırının üstündeki RewriteCond satırlarına yukarıdan aşağıya sıralamasıyla bakılır ve URLnin RewriteRule satırındaki substitution kısmına dönüştürülebilmesi için tüm RewriteCond şartlarının gerçeklenmesi gerekir. Yani RewriteCond satırlarından sadece bir tanesi bile URL için geçerli değilse, ona bağlı RewriteRule satırı hiçbir işe yaramaz yani substitution kısmı işlemgörmez ve varsa sonraki RewriteRule satırından işlem devam eder.

Şimdi de kodları takip ederken işime yaradıı kadar notlarım, siz lütfen tam açıklamalar için resmi sayfasına bakın ve örnekler iin de Google'da arayın, çünkü notlarım öğretmek için değil, en çok aklımda kalması gerekenleri bakınca ayıklamam içindir.

REQUEST_URI

REQUEST_FILENAME

-d  directory ise

-f dosyaysa

-l sembolik linkse

! ters yani not operatörü

=condPattern not ettimama unuttum şimdi

[NC] no case yani harf büyük veya küçük farketmez

[OR] RewriteCondlar arasına koyarız, her biri için ayrı ayrı RewriteRule yazmaktan tasarruf ettirir.,

[L] sonraki RewriteRule'dan devam etme bırak, buraya kadar demek.

^ satır başı

$ satır sonu

\ escape(kaçış) karakteri yani .[]() gibi karakterleri kullanabilmek için başına koyarız örneğin . için \. yazarız. Bu zaten tüm dillerde böyle.

- no substitution yani URLyi bulduğun gibi bırak demek. Mesela gelen URL üzerinde bir işlem yapmak istemiyorsak(örneğin bir klasörü sonraki kuralların dışında tutmak istiyoruz) RewriteRule URLpattern - [L] yazarsak, URLpattern diye belirttiğim temsili yerde yazan kurala uyan URLler - yani nosubstitution işaretinden dolayı aynen kalırlar ve [L] den dolayı sonraki kurallardan etkilenmezler, böylece mesela sunucudaki bazı klasörleri, istemcinin browserinden gelen dil ayarına göre farklı SEO urllerine yönlendirilmesinin önüne geçilereko klasörlerde bulunan diğer yazılımların problemsiz çalışmalarını sağlamış oluruz.

Ayrıca pattern mesela ^(klasör1|klasör2) gibi parantez içinde ve ortada dikme işareti şeklinde tanımlanırsa, regexden bildiğimi üzere, veya anlamında kullanmış oluruz.

 

Bunun dışında .htaccess dosyasında

Options foolowsymlinks ve RewriteEngine on yazmamız gerekebilir.

kaynak: http://httpd.apache.org/docs/current/mod/mod_rewrite.html

http://httpd.apache.org/docs/current/rewrite/intro.html

http://httpd.apache.org/docs/current/rewrite/