Apache Ubuntu 14.04 Üzerinde mod_rewrite Kurulumu ve Yapılandırması
Giriş
Web geliştirmenin temel taşlarından biri, kullanıcı dostu, arama motoru optimize edilmiş (SEO) ve güvenli URL yapıları oluşturmaktır. Apache web sunucusunun en güçlü modüllerinden biri olan mod_rewrite, bu hedeflere ulaşmak için vazgeçilmez bir araçtır. mod_rewrite, gelen URL isteklerini sunucu tarafında yeniden yazarak, dinamik içerikleri statik gibi gösteren, eski bağlantıları yenilerine yönlendiren veya belirli koşullara göre istekleri farklı kaynaklara yönlendiren karmaşık kurallar tanımlamanıza olanak tanır.
Bu makalede, Ubuntu 14.04 işletim sistemi üzerinde çalışan bir Apache web sunucusunda mod_rewrite modülünün nasıl kurulacağını, etkinleştirileceğini ve çeşitli senaryolar için nasıl yapılandırılacağını adım adım ele alacağız. Ubuntu 14.04, uzun süreli destek (LTS) sunan stabil bir sürüm olmasına rağmen, güncel Apache sürümlerinde bazı yapılandırma farklılıkları olabileceğini unutmamak önemlidir. Ancak temel mod_rewrite mantığı ve kuralları evrenseldir.
mod_rewrite‘ı doğru bir şekilde yapılandırmak, web sitenizin performansı, güvenliği ve kullanıcı deneyimi üzerinde önemli bir etkiye sahip olabilir. Gelin, bu güçlü aracı keşfetmeye başlayalım.
Ön Koşullar
mod_rewrite kurulumuna başlamadan önce, sisteminizin belirli gereksinimleri karşıladığından emin olmalısınız:
* Ubuntu 14.04 Sunucusu: Bu rehber Ubuntu 14.04’e odaklanmıştır.
* Apache Web Sunucusu: Sunucunuzda Apache2 web sunucusunun kurulu ve çalışır durumda olması gerekmektedir. Eğer kurulu değilse, aşağıdaki komutlarla kurabilirsiniz:
sudo apt-get update
sudo apt-get install apache2
* Sudo Yetkileri: Yapılandırma dosyalarını düzenlemek ve Apache hizmetini yönetmek için root veya sudo yetkilerine sahip bir kullanıcı olmalısınız.
* Temel Linux Bilgisi: Komut satırı kullanımı ve dosya düzenleme (nano, vim gibi editörlerle) konusunda temel bilgiye sahip olmanız beklenir.
* Metin Düzenleyici: Yapılandırma dosyalarını düzenlemek için bir metin düzenleyici (örneğin, nano veya vim) kullanacağız.
Bu ön koşullar sağlandığında, mod_rewrite kurulumuna ve yapılandırmasına başlayabiliriz.
mod_rewrite Modülünü Etkinleştirme
mod_rewrite, Apache’nin varsayılan olarak yüklü gelen ancak etkinleştirilmesi gereken bir modülüdür. Etkinleştirme işlemi oldukça basittir.
Apache’nin Çalıştığını Doğrulama
Kuruluma başlamadan önce Apache’nin düzgün çalıştığından emin olalım. Tarayıcınızda sunucunuzun IP adresini veya alan adını ziyaret ettiğinizde “It works!” veya Apache’nin varsayılan karşılama sayfasını görmelisiniz. Komut satırından da durumunu kontrol edebilirsiniz:
sudo service apache2 status
Çıktıda apache2 is running gibi bir ifade görmelisiniz.
mod_rewrite Modülünü Etkinleştirme
Apache modüllerini etkinleştirmek için a2enmod (Apache 2 enable module) komutu kullanılır. mod_rewrite‘ı etkinleştirmek için aşağıdaki komutu çalıştırın:
sudo a2enmod rewrite
Bu komut, rewrite.load dosyasını mods-available dizininden mods-enabled dizinine sembolik olarak bağlar. Komut başarıyla çalıştıktan sonra genellikle bir mesaj görürsünüz:
Enabling module rewrite.
To activate the new configuration, you need to restart apache2:
service apache2 restart
Apache’yi Yeniden Başlatma
Yeni etkinleştirilen modülün Apache tarafından yüklenmesi ve kullanılmaya başlanması için Apache hizmetini yeniden başlatmanız gerekmektedir:
sudo service apache2 restart
Herhangi bir hata mesajı almazsanız, mod_rewrite modülü artık sunucunuzda etkinleştirilmiş demektir.
Modülün Etkin Olduğunu Doğrulama
Modülün gerçekten etkinleştirildiğini doğrulamak için Apache’nin yüklediği modüllerin listesini kontrol edebilirsiniz:
apache2ctl -M | grep rewrite
Çıktıda rewrite_module (shared) gibi bir satır görmelisiniz. Bu, mod_rewrite‘ın başarıyla yüklendiğini gösterir.
Modül etkinleştirme işlemi tamamlandıktan sonra, mod_rewrite kurallarını uygulayabilmek için Apache’nin yapılandırma dosyalarında gerekli izinleri ayarlamamız gerekecek.
Apache Yapılandırmasını Düzenleme
mod_rewrite modülü etkinleştirildikten sonra, Apache’nin mod_rewrite kurallarını okumasına ve uygulamasına izin vermeniz gerekir. Bu izinler, Apache’nin ana yapılandırma dosyası olan apache2.conf içinde veya sanal ana bilgisayar (Virtual Host) yapılandırma dosyalarında ayarlanır.
AllowOverride Yönergesi
mod_rewrite kuralları genellikle .htaccess dosyaları aracılığıyla web sitesi dizinlerinde tanımlanır. Ancak Apache, varsayılan olarak .htaccess dosyalarındaki çoğu yönergeyi görmezden gelir. Bu davranışı değiştirmek için AllowOverride yönergesini kullanmanız gerekir.
* AllowOverride None (Varsayılan): Bu ayar, Apache’nin .htaccess dosyalarını tamamen görmezden gelmesini sağlar. Performans açısından en iyisidir ancak dinamik web uygulamaları için esneklik sağlamaz.
* AllowOverride All: Bu ayar, Apache’nin .htaccess dosyalarındaki tüm yönergeleri (mod_rewrite dahil) işlemesine izin verir.
* AllowOverride FileInfo: Bu ayar, mod_rewrite gibi URL manipülasyonu yapan yönergelerin .htaccess dosyalarında kullanılmasına izin verir. Çoğu zaman mod_rewrite için yeterlidir ve All‘dan daha güvenlidir.
mod_rewrite kullanacağımız için AllowOverride All veya AllowOverride FileInfo ayarlamamız gerekecek. All çoğu durumda işinizi görecektir.
Sanal Ana Bilgisayar (Virtual Host) Yapılandırmasını Düzenleme
En iyi uygulama, AllowOverride ayarını doğrudan web sitenizin sanal ana bilgisayar yapılandırma dosyasında yapmaktır. Bu, ayarları belirli bir siteyle sınırlar ve Apache’nin genel performansını etkilemez.
Ubuntu’da sanal ana bilgisayar yapılandırma dosyaları genellikle /etc/apache2/sites-available/ dizininde bulunur. Varsayılan olarak, 000-default.conf adında bir dosya bulunur. Kendi alan adınız için özel bir yapılandırma dosyanız varsa (örneğin, example.com.conf), onu düzenlemelisiniz.
Örnek olarak, varsayılan yapılandırma dosyasını düzenleyelim:
sudo nano /etc/apache2/sites-available/000-default.conf
Bu dosyanın içinde, sitenizin kök dizinini (DocumentRoot) belirten bloğunu bulacaksınız. Bu bloğun içine veya mevcut bloğunun içine AllowOverride All yönergesini eklemeniz veya mevcut None değerini All olarak değiştirmeniz gerekir.
Örnek bir yapılandırması şöyle görünebilir:
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
Options Indexes FollowSymLinks MultiViews
AllowOverride All # Burayı None'dan All olarak değiştirin
Order allow,deny
allow from all
AllowOverride All yönergesini, web sitenizin kök dizinini belirten bloğunun içine yerleştirdiğinizden emin olun. Genellikle bu /var/www/html veya projenizin kök dizinidir.
Önemli Not: Eğer web siteniz için özel bir sanal ana bilgisayar yapılandırması kullanıyorsanız (örneğin, example.com.conf), bu değişikliği o dosyada yapmalısınız. Değişikliği yaptıktan sonra, bu sanal ana bilgisayarın etkinleştirildiğinden emin olun:
sudo a2ensite 000-default.conf # veya kendi dosya adınız
Apache’yi Yeniden Başlatma
Yapılandırma dosyasında yaptığınız değişikliklerin etkili olması için Apache hizmetini yeniden başlatmanız gerekmektedir:
sudo service apache2 restart
Bu adımları tamamladıktan sonra, Apache artık web sitenizin .htaccess dosyalarındaki mod_rewrite kurallarını okuyup işleyebilir durumda olacaktır. Artık kendi mod_rewrite kurallarımızı oluşturmaya başlayabiliriz.
mod_rewrite Kuralları Oluşturma (.htaccess Dosyaları)
mod_rewrite kuralları genellikle web sitenizin kök dizininde veya alt dizinlerinde bulunan .htaccess adlı özel dosyalarda tanımlanır. .htaccess dosyaları, dizin bazında yapılandırma değişiklikleri yapmanıza olanak tanır ve ana Apache yapılandırma dosyasına erişiminiz olmadığında veya sadece belirli bir dizini etkilemek istediğinizde kullanışlıdır.
Not: .htaccess dosyaları her istekte işlendiği için performansı bir miktar etkileyebilir. Büyük ve yüksek trafikli sitelerde, mod_rewrite kurallarını doğrudan sanal ana bilgisayar yapılandırma dosyasına yazmak daha iyi bir uygulama olabilir. Ancak küçük ve orta ölçekli siteler için .htaccess pratik ve yaygın bir çözümdür.
.htaccess Dosyası Oluşturma
Web sitenizin kök dizininde (örneğin, /var/www/html/) bir .htaccess dosyası oluşturun veya düzenleyin:
sudo nano /var/www/html/.htaccess
Bu dosyanın içine mod_rewrite kurallarınızı yazacaksınız.
RewriteEngine On
Herhangi bir mod_rewrite kuralı uygulamadan önce, RewriteEngine yönergesini On olarak ayarlayarak mod_rewrite motorunu etkinleştirmeniz gerekir. Bu, .htaccess dosyanızın en başına eklemeniz gereken ilk satırdır:
RewriteEngine On
RewriteRule Söz Dizimi
RewriteRule yönergesi, mod_rewrite‘ın temelini oluşturur. Gelen bir URL’yi belirli bir desene göre eşleştirir ve başka bir URL ile değiştirir.
Söz Dizimi:
RewriteRule Pattern Substitution [Flags]
* Pattern (Desen): Gelen URL yolunu (alan adı ve sorgu dizesi hariç) eşleştirmek için kullanılan bir düzenli ifade (regex). Örneğin, ^index\.php$ index.php ile eşleşir.
* Substitution (Değiştirme): Desenle eşleşen URL’nin yerine geçecek olan yeni URL. Bu, göreceli bir yol, mutlak bir URL veya bir Apache kaynağı olabilir.
* Flags (Bayraklar): RewriteRule‘un davranışını değiştiren isteğe bağlı parametreler. Köşeli parantez içinde virgülle ayrılmış olarak belirtilirler. En yaygın kullanılan bayraklar şunlardır:
* [L] (Last): Kuralın eşleşmesi durumunda, başka hiçbir kuralın uygulanmamasını sağlar. Genellikle bir kuralın sonlandırılması gerektiğinde kullanılır.
* [R] (Redirect): Tarayıcıya bir HTTP yönlendirmesi gönderir. Varsayılan olarak 302 (geçici) yönlendirme yapar. [R=301] ile kalıcı yönlendirme (301 Moved Permanently) belirtebilirsiniz.
* [NC] (No Case): Desen eşleştirmesini büyük/küçük harfe duyarsız hale getirir.
* [QSA] (Query String Append): Orijinal URL’nin sorgu dizesini (query string) yeniden yazılan URL’ye ekler. Bu, özellikle parametreleri korumak istediğinizde önemlidir.
* [OR] (OR Condition): RewriteCond yönergeleri arasında mantıksal OR işlemi yapar.
RewriteCond Söz Dizimi
RewriteCond yönergesi, bir RewriteRule‘un uygulanabilmesi için ek koşullar tanımlamanıza olanak tanır. Bir RewriteRule‘dan önce birden fazla RewriteCond olabilir; tüm koşullar doğru olduğunda RewriteRule uygulanır (mantıksal AND işlemi).
Söz Dizimi:
RewriteCond TestString Condition [Flags]
* TestString (Test Dizisi): Koşulu uygulamak istediğiniz dize. Bu genellikle bir sunucu değişkeni (örneğin, %{REQUEST_URI}, %{HTTP_HOST}, %{HTTPS}) veya bir HTTP başlığıdır.
* Condition (Koşul): TestString ile eşleştirilecek bir düzenli ifade.
* Flags (Bayraklar):
* [NC] (No Case): Koşul eşleştirmesini büyük/küçük harfe duyarsız hale getirir.
* [OR] (OR Condition): Bir sonraki RewriteCond ile mantıksal OR işlemi yapar. Bu bayrak olmadan, RewriteCond‘lar varsayılan olarak AND ile birleştirilir.
* [L] (Last): Bu koşul eşleşirse, diğer koşulları değerlendirmeden kuralı uygula (nadiren kullanılır).
Yaygın TestString Değişkenleri:
* %{REQUEST_URI}: Sorgu dizesi olmadan istenen URL yolu (örn. /index.php).
* %{HTTP_HOST}: İsteğin yapıldığı ana bilgisayar adı (örn. www.example.com).
* %{HTTPS}: İstek HTTPS üzerinden yapılıyorsa on, değilse off.
* %{QUERY_STRING}: URL’nin sorgu dizesi (örn. id=123&cat=4).
* %{REQUEST_FILENAME}: Sunucudaki fiziksel dosya yolu.
* %{ENV:VAR}: Ortam değişkeni.
Artık RewriteRule ve RewriteCond‘un temel söz dizimlerini anladığımıza göre, yaygın kullanım senaryolarına ve pratik örneklere geçebiliriz.
Yaygın mod_rewrite Kullanım Senaryoları ve Örnekleri
Bu bölümde, mod_rewrite‘ın en sık kullanılan özelliklerini gösteren pratik örneklere göz atacağız. Tüm bu örnekleri .htaccess dosyanıza RewriteEngine On satırının altına ekleyebilirsiniz.
1. WWW Olmayan Alan Adından WWW’li Alan Adına Yönlendirme
Birçok web sitesi, alan adının www önekiyle mi yoksa www öneki olmadan mı erişileceğine karar verir. Tutarlılık ve SEO için tek bir versiyona yönlendirme yapmak iyi bir uygulamadır.
RewriteEngine On
RewriteCond %{HTTP_HOST} ^example\.com [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301]
Açıklama:
* RewriteCond %{HTTP_HOST} ^example\.com [NC]: Eğer gelen isteğin ana bilgisayar adı example.com ile başlıyorsa (büyük/küçük harf duyarsız), bu koşul doğru olur.
RewriteRule ^(.)$ http://www.example.com/$1 [L,R=301]: Eğer koşul doğruysa, gelen tüm URL’leri (^(.*)$ ile eşleşen her şey) http://www.example.com/ önüne ekleyerek kalıcı olarak (R=301) yönlendir. [L] bayrağı, bu kural uygulandıktan sonra başka kuralın işlenmemesini sağlar.
WWW’den WWW olmayana yönlendirmek isterseniz:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
RewriteRule ^(.*)$ http://example.com/$1 [L,R=301]
2. HTTP’den HTTPS’ye Zorlama (SSL Yönlendirmesi)
Güvenlik ve SEO için tüm trafiği HTTPS’ye yönlendirmek günümüzde standart bir uygulamadır.
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Açıklama:
* RewriteCond %{HTTPS} off: Eğer gelen istek HTTPS üzerinden yapılmıyorsa (off), bu koşul doğru olur.
RewriteRule ^(.)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]: Eğer koşul doğruysa, gelen tüm URL’leri (^(.*)$) aynı ana bilgisayar adı (%{HTTP_HOST}) ve aynı istek URI’si (%{REQUEST_URI}) ile HTTPS versiyonuna kalıcı olarak yönlendir.
3. Dosya Uzantılarını Gizleme (Pretty URLs)
Kullanıcı dostu URL’ler oluşturmak için dosya uzantılarını (örn. .php, .html) gizleyebilirsiniz.
Örneğin, hakkimizda.php adresini hakkimizda olarak göstermek istiyorsunuz.
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)$ $1.php [L]
Açıklama:
* RewriteCond %{REQUEST_FILENAME} !-f: İstenen URI’nin fiziksel bir dosya olmadığını kontrol eder.
* RewriteCond %{REQUEST_FILENAME} !-d: İstenen URI’nin fiziksel bir dizin olmadığını kontrol eder.
* RewriteRule ^([^/]+)$ $1.php [L]: Eğer yukarıdaki koşullar doğruysa (yani hakkimizda gibi bir istek fiziksel bir dosya veya dizin değilse), gelen URL’yi (^([^/]+)$ ile eşleşen herhangi bir dizeyi) alıp sonuna .php ekler ($1.php). Bu, hakkimizda isteğini dahili olarak hakkimizda.php olarak işler.
Bu kural, sadece bir seviye derinlikteki URL’ler için çalışır. Daha karmaşık URL yapıları için (örn. kategori/urun), daha karmaşık regex’ler gerekebilir.
4. Kullanıcı Dostu URL’ler Oluşturma (Dinamik İçeriği Statik Gibi Gösterme)
Dinamik bir sayfa olan urun.php?id=123 adresini urun/123 gibi daha okunabilir bir hale getirmek için.
RewriteEngine On
RewriteRule ^urun/([0-9]+)/?$ urun.php?id=$1 [NC,L,QSA]
Açıklama:
* RewriteRule ^urun/([0-9]+)/?$ urun.php?id=$1 [NC,L,QSA]:
* ^urun/([0-9]+)/?$: Gelen URL’nin urun/ ile başlayıp ardından bir veya daha fazla sayı ([0-9]+) gelip gelmediğini kontrol eder. ([0-9]+) parantez içindeki kısım, eşleşen sayı grubunu $1 değişkenine atar. /? isteğe bağlı olarak sonda bir eğik çizgi olabileceğini belirtir.
* urun.php?id=$1: Eşleşen URL’yi dahili olarak urun.php?id= ile $1 değişkenindeki sayıyı kullanarak yeniden yazar.
* [NC]: Büyük/küçük harf duyarsız.
* [L]: Son kural.
* [QSA]: Orijinal URL’deki sorgu dizesini (varsa) yeniden yazılan URL’ye ekler. Bu örnekte olmasa da, diğer parametreler olsaydı işe yarardı.
5. Eski URL’lerden Yeni URL’lere Kalıcı Yönlendirme (301 Redirect)
Web sitenizi yeniden yapılandırdığınızda veya bir sayfanın URL’sini değiştirdiğinizde, eski URL’ye gelen trafiği kaybetmemek ve SEO değerini korumak için 301 kalıcı yönlendirmeler kullanmak önemlidir.
RewriteEngine On
RewriteRule ^eski-sayfa\.html$ /yeni-sayfa.html [L,R=301]
RewriteRule ^eski-dizin/(.*)$ /yeni-dizin/$1 [L,R=301]
Açıklama:
* İlk kural, eski-sayfa.html adresine gelen istekleri yeni-sayfa.html adresine kalıcı olarak yönlendirir.
İkinci kural, eski-dizin/ altındaki tüm içerikleri yeni-dizin/ altına yönlendirir. (.) ile eşleşen kısım $1 değişkenine atanır ve yeni URL’de kullanılır.
6. Dizin Listelemesini Engelleme
Güvenlik açısından, kullanıcıların web sunucunuzdaki dizinlerin içeriğini listelemesini engellemek iyi bir uygulamadır. Bu, mod_rewrite ile doğrudan yapılmasa da, .htaccess dosyasına ekleyebileceğiniz ilgili bir güvenlik önlemidir.
Options -Indexes
Bu kural, Apache’nin dizin listeleme özelliğini devre dışı bırakır. Eğer bir dizinde index.html veya index.php gibi bir dizin dosyası yoksa, kullanıcılar dizin içeriğini göremez.
7. Belirli IP Adreslerine Göre Erişimi Kısıtlama
Belirli bir IP adresinden gelen istekleri engellemek veya sadece belirli IP adreslerine izin vermek için mod_rewrite ve mod_access_compat (Ubuntu 14.04’te genellikle varsayılan olarak etkin) kullanılabilir.
RewriteEngine On
RewriteCond %{REMOTE_ADDR} ^192\.168\.1\.100$
RewriteRule .* - [F]
Açıklama:
* RewriteCond %{REMOTE_ADDR} ^192\.168\.1\.100$: Eğer gelen isteğin IP adresi 192.168.1.100 ise, bu koşul doğru olur.
RewriteRule . - [F]: Eğer koşul doğruysa, tüm istekleri (.*) reddet (- yerine bir dosya belirtilmez, [F] (Forbidden) bayrağı 403 HTTP hatası döndürür).
Bu sadece birkaç yaygın örnektir. mod_rewrite‘ın esnekliği sayesinde çok daha karmaşık ve özelleştirilmiş kurallar oluşturmak mümkündür.
Hata Ayıklama ve Sorun Giderme
mod_rewrite kuralları oldukça güçlü olabilir, ancak aynı zamanda yanlış yapılandırıldığında web sitenizin çalışmamasına neden olabilir. İşte sorun giderme için bazı ipuçları:
1. Apache Hata Kayıtları
Apache hata günlükleri, mod_rewrite ile ilgili sorunları teşhis etmek için ilk başvurmanız gereken yerdir. Ubuntu 14.04’te hata günlükleri genellikle /var/log/apache2/error.log konumundadır.
sudo tail -f /var/log/apache2/error.log
Bu komut, hata günlüğünü gerçek zamanlı olarak izlemenizi sağlar. Bir hata yaptığınızda veya bir kuralın beklendiği gibi çalışmadığını düşündüğünüzde buraya bakın.
2. RewriteLogLevel ve RewriteLog (Apache 2.4+ için Dikkat)
Apache 2.2’de RewriteLog ve RewriteLogLevel yönergeleri, mod_rewrite‘ın nasıl çalıştığına dair ayrıntılı günlükler sağlamak için kullanılırdı. Ancak Apache 2.4 ve sonraki sürümlerinde bu yönergeler performans nedenleriyle kullanımdan kaldırılmıştır.
Apache 2.4+’ta, mod_rewrite hata ayıklama bilgilerini görmek için Apache’nin genel LogLevel ayarını debug olarak değiştirebilirsiniz. Bu, çok fazla günlük çıktısı üretebilir, bu yüzden sadece hata ayıklama yaparken kullanın ve işiniz bittiğinde geri alın.
apache2.conf veya sanal ana bilgisayar dosyanızda:
LogLevel debug rewrite:trace8
rewrite:trace8 en yüksek ayrıntı seviyesidir. Bu ayarı yaptıktan sonra Apache’yi yeniden başlatın ve error.log dosyasını kontrol edin. mod_rewrite‘ın her adımı hakkında ayrıntılı bilgiler göreceksiniz.
İşiniz bittiğinde, LogLevel ayarını eski değerine (örn. warn veya error) döndürmeyi unutmayın.
3. apachectl configtest
Yapılandırma dosyalarında (özellikle .htaccess dışındaki ana yapılandırma dosyalarında) bir değişiklik yaptığınızda, Apache’yi yeniden başlatmadan önce söz dizimi hatası olup olmadığını kontrol etmek iyi bir fikirdir:
sudo apachectl configtest
Eğer Syntax OK çıktısını alırsanız, yapılandırmanızın söz dizimi açısından doğru olduğu anlamına gelir. Herhangi bir hata varsa, hata mesajı size sorunun nerede olduğunu söyleyecektir.
4. Tarayıcı Önbelleği
HTTP yönlendirmeleri (özellikle 301 kalıcı yönlendirmeler) tarayıcılar tarafından önbelleğe alınabilir. Bu, bir yönlendirme kuralını değiştirdiğinizde, tarayıcınızın hala eski yönlendirmeyi kullanmaya devam etmesine neden olabilir. Hata ayıklama yaparken tarayıcı önbelleğinizi temizlemeyi veya gizli (incognito) mod kullanmayı unutmayın.
5. AllowOverride Ayarları
.htaccess kurallarınızın çalışmadığını fark ederseniz, ilk kontrol etmeniz gereken yerlerden biri AllowOverride yönergesidir. Sanal ana bilgisayarınızın bloğunda AllowOverride All veya AllowOverride FileInfo olarak ayarlandığından emin olun.
6. Düzenli İfade (Regex) Test Araçları
mod_rewrite kurallarındaki desenler düzenli ifadeler (regex) kullanır. Regex yazmak karmaşık olabilir ve küçük bir hata bile kuralın çalışmamasına neden olabilir. Regex test araçlarını (çevrimiçi regex test siteleri gibi) kullanarak desenlerinizin beklediğiniz gibi eşleşip eşleşmediğini kontrol edebilirsiniz.
Bu hata ayıklama teknikleri, mod_rewrite ile karşılaşabileceğiniz çoğu sorunu çözmenize yardımcı olacaktır.
Performans ve Güvenlik Hususları
mod_rewrite güçlü bir araç olsa da, yanlış kullanıldığında performans sorunlarına veya güvenlik açıklarına yol açabilir.
Performans Hususları
* .htaccess Dosyalarının Performansa Etkisi: .htaccess dosyaları, Apache’nin her gelen isteği işlerken ilgili dizinlerde ve üst dizinlerde arama yapmasına ve bu dosyaları okumasına neden olur. Bu, özellikle yüksek trafikli sitelerde veya karmaşık dizin yapılarına sahip sitelerde performansı olumsuz etkileyebilir. Mümkünse, mod_rewrite kurallarınızı doğrudan sanal ana bilgisayar yapılandırma dosyalarına (örneğin, /etc/apache2/sites-available/your_site.conf) yazmayı tercih edin. Bu, Apache’nin kuralları yalnızca bir kez yüklemesini ve derlemesini sağlar.
* Karmaşık Düzenli İfadeler (Regex): Çok karmaşık veya verimsiz yazılmış düzenli ifadeler, Apache’nin CPU kaynaklarını tüketebilir. Regex’lerinizi mümkün olduğunca basit ve optimize edilmiş tutmaya çalışın.
* Çok Sayıda Kural: Çok sayıda RewriteRule ve RewriteCond kuralı, her isteğin işlenmesi için gereken süreyi artırabilir. Kurallarınızı düzenli tutun ve gereksiz olanları kaldırın.
Güvenlik Hususları
* AllowOverride All Kullanımı: AllowOverride All yönergesini kullanmak, .htaccess dosyalarının Apache’nin yapılandırmasının hemen hemen her yönünü değiştirmesine izin verir. Bu, paylaşımlı barındırma ortamlarında veya kullanıcıların kendi .htaccess dosyalarını yüklemesine izin verdiğiniz durumlarda bir güvenlik riski oluşturabilir. Mümkünse AllowOverride FileInfo gibi daha kısıtlı bir seçenek kullanın veya kuralları doğrudan sanal ana bilgisayar yapılandırmasına yazın.
* FollowSymLinks ve Options -Indexes:
* FollowSymLinks seçeneği, sembolik bağlantıların izlenmesine izin verir. Kötü niyetli bir kullanıcı, sembolik bağlantılar oluşturarak sunucunuzdaki hassas dosyalara erişmeye çalışabilir. Eğer güvenlik endişeleriniz varsa ve sembolik bağlantılara ihtiyacınız yoksa, Options -FollowSymLinks kullanmayı düşünebilirsiniz. Alternatif olarak SymLinksIfOwnerMatch daha güvenli bir seçenektir.
* Options -Indexes yönergesini kullanarak dizin listelemeyi devre dışı bırakmak, sitenizin dizin yapısının ve içeriğinin istenmeyen şekilde açığa çıkmasını engeller. Bu, temel bir güvenlik önlemidir.
* DDoS Saldırıları: Çok karmaşık veya kötü yapılandırılmış mod_rewrite kuralları, sunucunuzu DDoS (Dağıtık Hizmet Reddi) saldırılarına karşı daha savunmasız hale getirebilir. Özellikle harici kaynaklara (örneğin, başka bir sunucuya yönlendirme) yapılan yoğun yönlendirmeler risk oluşturabilir.
* Kullanıcı Girişlerini Filtreleme: Kullanıcı tarafından sağlanan verileri mod_rewrite kurallarında kullanırken dikkatli olun. Kötü niyetli kullanıcılar, belirli girdilerle sunucunuzu manipüle etmeye çalışabilir. Her zaman kullanıcı girişlerini doğrulamak ve temizlemek en iyi uygulamadır.
Bu hususları göz önünde bulundurarak, mod_rewrite‘ı güvenli ve performanslı bir şekilde kullanabilirsiniz.
Sonuç
mod_rewrite, Apache web sunucusunun en güçlü ve esnek modüllerinden biridir. Bu makalede, Ubuntu 14.04 üzerinde mod_rewrite‘ı nasıl etkinleştireceğinizi, Apache yapılandırmasını nasıl düzenleyeceğinizi ve .htaccess dosyaları aracılığıyla çeşitli senaryolar için nasıl kurallar oluşturacağınızı ayrıntılı olarak inceledik. WWW yönlendirmelerinden HTTPS zorlamaya, kullanıcı dostu URL’ler oluşturmaktan eski bağlantıları yönlendirmeye kadar birçok yaygın kullanım örneğini ele aldık.
Ayrıca, mod_rewrite kurallarını uygularken karşılaşabileceğiniz sorunları gidermek için hata ayıklama tekniklerine ve performansı ve güvenliği artırmak için en iyi uygulamalara değindik. Unutmayın ki, mod_rewrite‘ın gücü, düzenli ifadelerdeki yetkinliğiniz ve Apache’nin yapılandırma mekanizmalarını anlamanızla doğru orantılıdır.
mod_rewrite‘ı doğru bir şekilde yapılandırmak, web sitenizin SEO performansını önemli ölçüde artırabilir, kullanıcı deneyimini iyileştirebilir ve daha temiz, daha yönetilebilir bir URL yapısı sağlayabilir. Başlangıçta biraz karmaşık görünse de, pratik yaparak ve örnekleri deneyerek bu güçlü aracın potansiyelini tam olarak kullanabilirsiniz. Web geliştirme yolculuğunuzda mod_rewrite size büyük bir esneklik ve kontrol sağlayacaktır.