Takip et

Apache ve Ubuntu 16.04 Üzerinde mod_rewrite ile URL Yeniden Yazma Rehberi

Apache ve Ubuntu 16.04 Üzerinde mod_rewrite ile URL Yeniden Yazma Rehberi Giriş İnternet dünyasında web sitelerinin kullanıcı deneyimi, arama

Apache ve Ubuntu 16.04 Üzerinde mod_rewrite ile URL Yeniden Yazma Rehberi

Giriş

İnternet dünyasında web sitelerinin kullanıcı deneyimi, arama motoru optimizasyonu (SEO) ve genel performansı için URL’lerin yapısı kritik bir öneme sahiptir. Karmaşık, parametrelerle dolu URL’ler hem kullanıcılar tarafından hatırlanması zor hem de arama motorları tarafından daha az tercih edilen bir yapı sunar. İşte tam bu noktada “URL yeniden yazma” (URL rewriting) devreye girer. Bu teknik, sunucu tarafında gelen istek URL’lerini alarak, daha okunabilir, anlamlı ve SEO dostu bir formata dönüştürmeyi sağlar.

Bu makalede, Apache web sunucusunun en güçlü modüllerinden biri olan mod_rewrite‘ı kullanarak Ubuntu 16.04 işletim sistemi üzerinde URL’leri nasıl yeniden yazacağımızı detaylı bir şekilde inceleyeceğiz. Ubuntu 16.04, uzun süreli destek (LTS) sürümü olması nedeniyle birçok sunucu ortamında hala yaygın olarak kullanılmaktadır ve Apache 2.4 sürümü ile birlikte gelir. mod_rewrite‘ın temellerinden başlayarak, kurulumunu, yapılandırmasını, yaygın kullanım senaryolarını ve hata ayıklama yöntemlerini adım adım ele alacağız. Amacımız, web geliştiricilerine ve sistem yöneticilerine, temiz URL’ler oluşturma, yönlendirmeler yapma ve web uygulamalarını daha esnek hale getirme konusunda kapsamlı bir rehber sunmaktır.

mod_rewrite Nedir?

mod_rewrite, Apache HTTP Sunucusu için güçlü ve esnek bir URL manipülasyon modülüdür. Gelen URL isteklerini, düzenli ifadeler (regular expressions) kullanarak dinamik olarak yeniden yazma veya başka bir URL’ye yönlendirme yeteneği sunar. Bu modül, web sunucusunun çekirdek işlevselliğine entegre edilmiş olup, HTTP isteklerinin işlenme döngüsünün erken aşamalarında devreye girer. Bu sayede, tarayıcıya gösterilen URL ile sunucunun dahili olarak işlediği URL arasında bir soyutlama katmanı oluşturulur.

mod_rewrite‘ın gücü, karmaşık koşullar tanımlayabilme ve bu koşullara bağlı olarak farklı yeniden yazma veya yönlendirme eylemleri gerçekleştirebilmesinden gelir. Örneğin, bir web sitesindeki urun.php?id=123 gibi bir URL’yi kullanıcı dostu urun/123 şeklinde gösterebilirsiniz. Ya da HTTP üzerinden gelen tüm istekleri otomatik olarak HTTPS’ye yönlendirebilirsiniz. Bu esneklik, modern web uygulamalarının geliştirilmesinde, SEO stratejilerinde ve güvenlik önlemlerinde mod_rewrite‘ı vazgeçilmez bir araç haline getirir.

Kurallar genellikle iki ana yerde tanımlanabilir:
1. Sunucu Yapılandırma Dosyaları: httpd.conf, apache2.conf veya sites-enabled dizinindeki sanal host yapılandırma dosyaları (.conf). Bu yöntem, performansı artırır çünkü Apache sunucu başlatıldığında veya yeniden yüklendiğinde kuralları bir kez okur ve önbelleğe alır.
2. .htaccess Dosyaları: Belirli dizinlerde bulunan dağıtılmış yapılandırma dosyalarıdır. Bu dosyalar, sunucu yöneticisinin ana yapılandırma dosyalarına erişimi olmayan kullanıcıların (örneğin paylaşımlı hosting kullanıcıları) kendi dizinleri için özel kurallar tanımlamasına olanak tanır. Ancak, her gelen istekte Apache’nin ilgili dizin ve üst dizinlerde .htaccess dosyalarını araması ve okuması gerektiği için performansı olumsuz etkileyebilir. Güvenlik ve performans açısından mümkünse sunucu yapılandırma dosyaları tercih edilmelidir.

Ubuntu 16.04 üzerinde Apache 2.4 ile çalışırken, genellikle /etc/apache2/apache2.conf ana yapılandırma dosyası veya /etc/apache2/sites-available/ içindeki sanal host dosyaları (.conf uzantılı) kullanılır. Eğer .htaccess kullanmak isterseniz, ilgili dizin için AllowOverride All yönergesini ayarlamanız gerekecektir.

Ortam Kurulumu ve Ön Gereksinimler

mod_rewrite‘ı kullanmaya başlamadan önce, Ubuntu 16.04 sunucunuzda Apache’nin kurulu ve mod_rewrite modülünün etkinleştirilmiş olduğundan emin olmalıyız. Ayrıca, .htaccess dosyaları kullanmayı planlıyorsanız, Apache’nin bu dosyalardaki kuralları okumasına izin vermemiz gerekecektir.

Ubuntu 16.04’te Apache Kurulumu

Eğer sunucunuzda Apache henüz kurulu değilse, aşağıdaki adımları izleyerek kurabilirsiniz:

1. Paket listelerini güncelleyin:

sudo apt update

2. Apache web sunucusunu kurun:

sudo apt install apache2

3. Kurulumdan sonra Apache servisinin çalıştığını doğrulayın:

sudo systemctl status apache2

Çıktıda active (running) ifadesini görmelisiniz.
4. Güvenlik duvarı (UFW) kullanıyorsanız, Apache’ye gelen trafiğe izin vermeniz gerekir:

sudo ufw allow 'Apache Full'
    sudo ufw enable

Tarayıcınızda sunucunuzun IP adresini ziyaret ettiğinizde “Apache2 Ubuntu Default Page” sayfasını görmelisiniz.

mod_rewrite Modülünü Etkinleştirme

Apache kurulumu tamamlandıktan sonra, mod_rewrite modülünü etkinleştirmemiz gerekir. Ubuntu/Debian tabanlı sistemlerde bu işlem a2enmod (Apache 2 Enable Mod) komutu ile kolayca yapılır:

1. mod_rewrite modülünü etkinleştirin:

sudo a2enmod rewrite

Bu komut, /etc/apache2/mods-available/rewrite.load dosyasından sembolik bir bağlantı oluşturarak modülü etkinleştirir.
2. Değişikliklerin etkili olması için Apache servisini yeniden başlatın:

sudo systemctl restart apache2

Artık mod_rewrite kullanıma hazırdır.

Dizin İzinlerini Yapılandırma (AllowOverride)

Eğer URL yeniden yazma kurallarınızı .htaccess dosyalarında tanımlamak istiyorsanız (ki bu, özellikle paylaşımlı hosting ortamlarında yaygındır), Apache’nin ilgili dizinler için .htaccess dosyalarını okumasına izin vermeniz gerekir. Bu izin, Apache’nin ana yapılandırma dosyası olan /etc/apache2/apache2.conf içinde veya sanal host yapılandırma dosyalarınızda (/etc/apache2/sites-available/*.conf) Directory bloğu içinde AllowOverride yönergesi ile verilir.

Varsayılan olarak, Apache’nin kök dizini olan /var/www/html için AllowOverride None ayarı mevcuttur. Bu, .htaccess dosyalarının bu dizinde ve alt dizinlerinde dikkate alınmayacağı anlamına gelir. Bu ayarı AllowOverride All olarak değiştirmemiz gerekir:

1. Apache ana yapılandırma dosyasını bir metin düzenleyici ile açın:

sudo nano /etc/apache2/apache2.conf

2. Dosya içinde bloğunu bulun. İçindeki AllowOverride None satırını AllowOverride All olarak değiştirin:


            Options Indexes FollowSymLinks
            AllowOverride All   # Burayı None'dan All olarak değiştirin
            Require all granted
    

Eğer web siteniz /var/www/html dışında başka bir dizinde ise, o dizin için de benzer bir Directory bloğu oluşturmanız veya mevcut bloğu düzenlemeniz gerekebilir. Örneğin:


            Options Indexes FollowSymLinks
            AllowOverride All
            Require all granted
    

3. Değişiklikleri kaydedip kapatın (Nano’da Ctrl+O, Enter, Ctrl+X).
4. Apache yapılandırmasında sözdizimi hatası olup olmadığını kontrol edin:

sudo apache2ctl configtest

Syntax OK çıktısını almalısınız.
5. Apache servisini yeniden başlatın:

sudo systemctl restart apache2

Artık /var/www/html dizininde (veya ayarladığınız başka bir dizinde) .htaccess dosyaları oluşturabilir ve mod_rewrite kurallarınızı buraya yazabilirsiniz.

mod_rewrite Temel Kuralları ve Sözdizimi

mod_rewrite kuralları genellikle üç ana yönergeden oluşur: RewriteEngine, RewriteCond ve RewriteRule. Bu yönergeler, karmaşık URL yeniden yazma mantıkları oluşturmak için bir araya getirilir.

RewriteEngine

Bu yönerge, mod_rewrite motorunu açıp kapatmak için kullanılır. Kurallarınızın çalışması için mutlaka On olarak ayarlanmalıdır.

Sözdizimi:

RewriteEngine On

veya

RewriteEngine Off

Genellikle .htaccess dosyasının veya sanal host yapılandırma bloğunun en başına yerleştirilir.

RewriteCond

RewriteCond (Rewrite Condition – Yeniden Yazma Koşulu), bir RewriteRule‘ın uygulanabilmesi için karşılanması gereken koşulları tanımlar. Bir RewriteRule‘dan önce birden fazla RewriteCond yönergesi tanımlanabilir. Tüm koşullar varsayılan olarak AND mantığıyla birleştirilir, ancak [OR] bayrağı ile bu davranış değiştirilebilir.

Sözdizimi:

RewriteCond TestString CondPattern [Flags]

* TestString: Kontrol edilecek dize. Bu genellikle sunucu değişkenleri (%{REQUEST_FILENAME}, %{HTTP_HOST}, %{HTTPS}, %{QUERY_STRING} vb.) veya geriye dönük referanslar (%1, %2 vb.) içerir.
* CondPattern: TestString ile eşleşecek düzenli ifade (regex) deseni.
* [Flags]: Koşulun davranışını değiştiren isteğe bağlı bayraklar.

Yaygın RewriteCond Bayrakları:
* [NC] (No Case): Desen eşleşmesini büyük/küçük harf duyarsız yapar.
* [OR] (Or): Bu koşulu bir sonraki RewriteCond ile OR mantığıyla birleştirir. Aksi takdirde varsayılan AND kullanılır.
* [L] (Last): Bu kural eşleşirse, başka hiçbir kuralın işlenmemesini sağlar.

Örnekler:
* Host adının www.example.com olup olmadığını kontrol etme:

RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]

* İstenen dosyanın var olup olmadığını kontrol etme:

RewriteCond %{REQUEST_FILENAME} !-f

(!-f “dosya değilse” anlamına gelir. -f “dosya ise”, -d “dizin ise” anlamına gelir.)
* HTTPS üzerinden gelip gelmediğini kontrol etme:

RewriteCond %{HTTPS} off

RewriteRule

RewriteRule (Yeniden Yazma Kuralı), asıl yeniden yazma veya yönlendirme işlemini gerçekleştiren yönergedir. Bir veya daha fazla RewriteCond tarafından belirlenen koşullar karşılandığında tetiklenir.

Sözdizimi:

RewriteRule Pattern Substitution [Flags]

* Pattern: Gelen URL yolunun (domain ve query string hariç) eşleştirileceği düzenli ifade deseni. Bu desen, RewriteCond‘daki CondPattern‘dan farklı olarak, URL’nin kendisini hedefler.
* Substitution: Pattern ile eşleşen URL’nin yerine geçecek yeni URL. Bu bir dosya yolu, tam bir URL veya bir sunucu değişkeni olabilir. Yakalanan gruplar ($1, $2 vb.) burada kullanılabilir.
* [Flags]: Kuralın davranışını değiştiren isteğe bağlı bayraklar.

Yaygın RewriteRule Bayrakları:
* [L] (Last): Bu kural eşleşirse, Apache’nin diğer tüm RewriteRule‘ları işlemeyi durdurmasını sağlar. Bu, genellikle bir kuralın nihai hedef olduğu durumlarda kullanılır.
* [R] veya [R=301] (Redirect): Tarayıcıya bir HTTP yönlendirmesi (varsayılan olarak 302 Temporary Redirect) gönderir. [R=301] kalıcı bir yönlendirme (Permanent Redirect) için kullanılır ve SEO açısından önemlidir.
* [NC] (No Case): Desen eşleşmesini büyük/küçük harf duyarsız yapar.
* [QSA] (Query String Append): Orijinal isteğin sorgu dizesini (query string) yeniden yazılan URL’ye ekler. Bu bayrak çok sık kullanılır, çünkü aksi takdirde sorgu dizeleri genellikle kaybolur.
* [P] (Proxy): Yeniden yazılan URL’yi dahili olarak bir proxy isteği olarak işler. mod_proxy modülünün etkinleştirilmiş olmasını gerektirir.
* [F] (Forbidden): Eşleşen URL’ye erişimi engeller ve 403 Forbidden hatası döndürür.
* [E=VAR:VALUE] (Environment Variable): Belirli bir ortam değişkenini ayarlar.

Regex Temelleri

mod_rewrite‘ı etkin bir şekilde kullanmak için temel düzenli ifade (regex) bilgisine sahip olmak önemlidir. İşte bazı temel regex karakterleri:
* . (Nokta): Herhangi bir karakterle eşleşir (satır sonu hariç).
(Yıldız): Önceki karakterin sıfır veya daha fazla tekrarıyla eşleşir.
* + (Artı): Önceki karakterin bir veya daha fazla tekrarıyla eşleşir.
* ? (Soru İşareti): Önceki karakterin sıfır veya bir tekrarıyla eşleşir.
* ^ (Şapka): Dizinin başlangıcıyla eşleşir.
* $ (Dolar): Dizinin sonuyla eşleşir.
* [] (Köşeli Parantez): Köşeli parantez içindeki herhangi bir karakterle eşleşir (örneğin, [a-z] küçük harflerle, [0-9] rakamlarla eşleşir).
* () (Parantez): Bir grubu yakalar. Yakalanan gruplara RewriteRule içinde $1, $2 vb. ile erişilir. RewriteCond içinde ise %1, %2 vb. ile erişilir.
* | (Dikey Çizgi): OR operatörü (örneğin, (elma|armut)).
* \ (Ters Eğik Çizgi): Özel karakterleri kaçış karakteri olarak kullanır (örneğin, \. gerçek bir nokta karakteriyle eşleşir, \s boşluk karakteriyle eşleşir).

Yaygın Kullanım Senaryoları ve Örnekler

Şimdi mod_rewrite‘ın gücünü gösteren bazı pratik örneklere göz atalım. Bu örnekler genellikle .htaccess dosyasına yazılır, ancak aynı kurallar sanal host yapılandırmasına da entegre edilebilir.

“Pretty URLs” Oluşturma (Anlamlı URL’ler)

Bu, mod_rewrite‘ın en yaygın kullanım alanlarından biridir. Dinamik içeriğe sahip sayfaların URL’lerini daha okunabilir ve SEO dostu hale getiririz.

Örnek 1: Ürün ID’sini URL’ye Taşıma
example.com/urun.php?id=123 yerine example.com/urun/123 kullanmak.

# .htaccess dosyasına
RewriteEngine On
RewriteRule ^urun/([0-9]+)/?$ urun.php?id=$1 [NC,L,QSA]

Açıklama:
* ^urun/: URL’nin urun/ ile başladığını belirtir.
* ([0-9]+): Bir veya daha fazla rakamdan oluşan bir grubu yakalar. Bu yakalanan değer urun.php‘ye $1 olarak aktarılır.
* /?: İsteğe bağlı olarak sondaki eğik çizgiyi eşleştirir.
* urun.php?id=$1: Yeniden yazılan dahili URL.
* [NC,L,QSA]: Büyük/küçük harf duyarsız eşleşme (NC), bu kural eşleştiğinde diğer kuralları durdur (L), orijinal sorgu dizesini ekle (QSA).

Örnek 2: Kategori Adını URL’ye Taşıma
example.com/kategori.php?ad=elektronik yerine example.com/kategori/elektronik kullanmak.

RewriteEngine On
RewriteRule ^kategori/([a-zA-Z0-9_-]+)/?$ kategori.php?ad=$1 [NC,L,QSA]

Açıklama:
* ([a-zA-Z0-9_-]+): Harflerden, rakamlardan, alt çizgiden veya tireden oluşan bir veya daha fazla karakter grubunu yakalar.

www Olmayan Adresleri www’ye Yönlendirme (veya Tersini)

Web sitenizin tek bir kanonik URL’ye sahip olması SEO için önemlidir. Genellikle example.com adresini www.example.com adresine yönlendirmek tercih edilir.

# www olmayan adresleri www'ye yönlendirme
RewriteEngine On
RewriteCond %{HTTP_HOST} ^example\.com [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301,NC]

Açıklama:
* RewriteCond %{HTTP_HOST} ^example\.com [NC]: Gelen isteğin host adının example.com (veya büyük/küçük harf duyarsız olarak example.com) olup olmadığını kontrol eder.
RewriteRule ^(.)$ http://www.example.com/$1 [L,R=301,NC]: Eğer koşul doğruysa, tüm URL yolunu yakalar ((.*)) ve http://www.example.com/ adresine 301 kalıcı yönlendirme ile $1 olarak ekler.

Tersini yapmak isterseniz (www.example.com adresini example.com adresine yönlendirme):

# www olan adresleri www olmayana yönlendirme
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
RewriteRule ^(.*)$ http://example.com/$1 [L,R=301,NC]

HTTP’den HTTPS’ye Yönlendirme

SSL/TLS sertifikası kurulu olan siteler için tüm trafiği güvenli HTTPS protokolüne yönlendirmek hem güvenlik hem de SEO açısından çok önemlidir.

# HTTP'den HTTPS'ye yönlendirme
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NC]

Açıklama:
* RewriteCond %{HTTPS} off: İstek HTTPS üzerinden gelmiyorsa (yani HTTP ise) koşul doğru olur.
RewriteRule ^(.)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NC]: Tüm URL yolunu yakalar ve aynı host ve URI ile HTTPS’ye 301 kalıcı yönlendirme yapar.

Dosya Uzantılarını Gizleme

page.php gibi URL’leri page olarak göstermek, URL’leri daha temiz hale getirir.

# .php uzantısını gizleme
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^\.]+)$ $1.php [NC,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. Bu iki koşul, gerçek dosya veya dizin adlarının yeniden yazılmasını engeller.
* RewriteRule ^([^\.]+)$ $1.php [NC,L]: Nokta içermeyen herhangi bir URL yolunu yakalar ([^\.]+) ve sonuna .php ekleyerek dahili olarak yeniden yazar.

Belirli Dosyaları veya Dizinleri Engelleme

Hassas dosyalara veya dizinlere doğrudan erişimi engellemek için mod_rewrite kullanılabilir.

Örnek 1: .htaccess Dosyasına Erişimi Engelleme
Bu, genellikle varsayılan olarak zaten engellenmiştir, ancak ekstra güvenlik için eklenebilir.

# .htaccess dosyasına doğrudan erişimi engelleme
RewriteEngine On
RewriteRule ^\.htaccess$ - [F]

Açıklama:
* RewriteRule ^\.htaccess$ - [F]: URL’si .htaccess olan herhangi bir isteği 403 Forbidden hatasıyla engeller. - hedef URL olmadığı anlamına gelir, çünkü sadece engellemek istiyoruz.

Örnek 2: Belirli Bir Dizin İçeriğine Erişimi Engelleme
Örneğin, /private dizinine web üzerinden erişimi engellemek.

# /private dizinine erişimi engelleme
RewriteEngine On
RewriteRule ^private/.*$ - [F]

Dizinlere Erişim Kontrolü (Front Controller Deseni)

Modern web çerçevelerinin çoğu (Laravel, Symfony, CodeIgniter vb.) bir “front controller” deseni kullanır. Bu desende, tüm istekler tek bir ana PHP dosyasına (genellikle index.php) yönlendirilir ve bu dosya isteği uygun denetleyiciye ve eyleme yönlendirir.

# Front Controller deseni için
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]

Açıklama:
* Bu kurallar, fiziksel olarak var olan bir dosya (-f) veya dizin (-d) istenmediği sürece, gelen tüm istekleri index.php dosyasına yönlendirir. $1 yakalanan URL yolunu index.php‘ye parametre olarak iletir. Bazı çerçeveler index.php?url=$1 şeklinde sorgu dizesi kullanabilir.

Eski URL’leri Yeni URL’lere Yönlendirme (301 Kalıcı Yönlendirme)

Bir web sitesinin yapısı değiştiğinde veya sayfalar taşındığında, eski URL’lerden yeni URL’lere 301 kalıcı yönlendirmeler yapmak SEO için hayati öneme sahiptir. Bu, arama motorlarının eski sayfanın değerini yeni sayfaya aktarmasını sağlar.

# Eski URL'den yeni URL'ye 301 yönlendirme
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 bir isteği yeni-sayfa.html adresine kalıcı olarak yönlendirir.
* İkinci kural, eski-dizin altındaki tüm URL’leri yeni-dizin altına kalıcı olarak yönlendirir, URL yolunun geri kalanını korur.

IP Adresine Göre Erişim Engelleme

Belirli IP adreslerinden gelen erişimi engellemek için mod_rewrite kullanılabilir.

# Belirli bir IP adresinden gelen erişimi engelleme
RewriteEngine On
RewriteCond %{REMOTE_ADDR} ^192\.168\.1\.100$
RewriteRule ^.*$ - [F]

Açıklama:
* RewriteCond %{REMOTE_ADDR} ^192\.168\.1\.100$: İsteğin geldiği IP adresinin 192.168.1.100 olup olmadığını kontrol eder.
RewriteRule ^.$ - [F]: Eğer IP eşleşirse, tüm istekleri 403 Forbidden hatasıyla engeller.

mod_rewrite Hata Ayıklama (Debugging)

mod_rewrite kuralları karmaşık olabilir ve beklenen şekilde çalışmayabilir. Bu durumda, hata ayıklama yetenekleri büyük önem taşır. Apache 2.4 ve sonraki sürümlerde (Ubuntu 16.04'te kullanılan sürüm), RewriteLog ve RewriteLogLevel yönergeleri kaldırılmıştır. Bunun yerine, Apache’nin genel LogLevel yönergesi kullanılır.

LogLevel debug rewrite:trace8

mod_rewrite ile ilgili ayrıntılı günlük kaydı almak için, sanal host yapılandırma dosyanıza veya /etc/apache2/apache2.conf dosyasına aşağıdaki satırı ekleyebilirsiniz:

LogLevel debug rewrite:trace8

Açıklama:
* LogLevel debug: Genel hata ayıklama düzeyini debug olarak ayarlar.
* rewrite:trace8: mod_rewrite modülü için özel olarak trace8 seviyesinde (en yüksek detay seviyesi) günlük kaydı tutulmasını sağlar.

Bu ayarı ekledikten sonra Apache’yi yeniden başlatmanız gerekir:

sudo systemctl restart apache2

Hata günlüklerini (/var/log/apache2/error.log) izleyerek mod_rewrite kurallarının nasıl işlendiğini görebilirsiniz:

sudo tail -f /var/log/apache2/error.log

Bu günlükler, hangi kuralların uygulandığını, hangi koşulların eşleştiğini veya eşleşmediğini ve URL’nin nasıl yeniden yazıldığını adım adım gösterir. Bu bilgiler, kurallarınızdaki hataları tespit etmek için paha biçilmezdir.

apache2ctl configtest

mod_rewrite kurallarınızı veya Apache yapılandırmanızı değiştirdikten sonra, Apache’yi yeniden başlatmadan önce sözdizimi hatalarını kontrol etmek her zaman iyi bir uygulamadır:

sudo apache2ctl configtest

Eğer Syntax OK çıktısını alırsanız, yapılandırmanızda bir sözdizimi hatası yoktur. Aksi takdirde, hata mesajı size sorunun nerede olduğunu gösterecektir.

Performans ve Güvenlik Hususları

mod_rewrite güçlü bir araç olsa da, yanlış kullanımı performansı düşürebilir veya güvenlik açıkları oluşturabilir.

.htaccess vs. Sunucu Konfigürasyonu

Daha önce de belirtildiği gibi, .htaccess dosyaları her gelen istekte Apache tarafından aranır ve okunur. Bu, özellikle yüksek trafikli sitelerde önemli bir performans düşüşüne neden olabilir. Mümkünse, mod_rewrite kurallarınızı sunucu yapılandırma dosyalarınıza (/etc/apache2/sites-available/*.conf içindeki sanal host yapılandırmaları) yerleştirmeniz önerilir. Bu, Apache’nin kuralları yalnızca bir kez yüklemesini ve önbelleğe almasını sağlar, böylece her istekte dosya okuma yükünden kaçınılır.

Eğer .htaccess kullanmak zorundaysanız (örneğin paylaşımlı hosting ortamında), kuralları mümkün olduğunca basit tutmaya çalışın ve çok fazla RewriteCond veya karmaşık regex desenlerinden kaçının.

Karmaşık Regex Kullanımının Etkisi

Düzenli ifadeler güçlüdür, ancak aynı zamanda işlemci yoğun olabilir. Çok karmaşık veya verimsiz yazılmış regex desenleri, her istekte Apache’nin daha fazla CPU döngüsü harcamasına neden olabilir. Kurallarınızı yazarken mümkün olduğunca basit ve optimize edilmiş regex desenleri kullanmaya özen gösterin. Testler yaparak performans üzerindeki etkilerini gözlemleyin.

Güvenlik Riskleri

Yanlış yapılandırılmış mod_rewrite kuralları, sitenizde güvenlik açıklarına yol açabilir. Örneğin:
* Açık Yönlendirmeler: Kullanıcı girdisini doğrudan bir RewriteRule‘da hedef URL olarak kullanmak, saldırganların sitenizi kullanarak kullanıcıları kötü amaçlı sitelere yönlendirmesine izin verebilir. Her zaman kullanıcı girdisini dikkatlice doğrulayın ve filtreleyin.
* Bilgi Sızıntısı: Yanlışlıkla hassas dosyaların veya dizinlerin doğrudan erişime açılması.
* DoS Saldırıları: Sonsuz yönlendirme döngüleri veya çok karmaşık regex’ler, sunucunuzu DoS (Denial of Service) saldırılarına karşı savunmasız hale getirebilir. [L] (Last) bayrağını doğru yerlerde kullanarak sonsuz döngüleri önleyin.

Herhangi bir mod_rewrite kuralı uygulamadan önce, etkilerini dikkatlice test etmek ve güvenlik açısından gözden geçirmek kritik öneme sahiptir.

Sonuç

Apache’nin mod_rewrite modülü, web geliştiricilerine ve sistem yöneticilerine URL’leri manipüle etme konusunda inanılmaz bir güç ve esneklik sunar. Ubuntu 16.04 üzerinde Apache 2.4 ile çalışırken, bu modülü kullanarak temiz ve anlamlı URL’ler oluşturabilir, SEO’yu iyileştirebilir, kullanıcı deneyimini zenginleştirebilir ve web uygulamalarınızın altyapısını daha esnek hale getirebilirsiniz.

Bu makalede, mod_rewrite‘ın temel prensiplerini, Ubuntu 16.04 ortamında nasıl kurulup etkinleştirileceğini, RewriteEngine, RewriteCond ve RewriteRule gibi ana yönergelerin sözdizimini ve yaygın kullanım senaryolarını detaylı örneklerle ele aldık. Ayrıca, hata ayıklama teknikleri ve performans ile güvenlik hususları hakkında önemli bilgiler paylaştık.

Unutmayın ki mod_rewrite‘ın gücü, aynı zamanda karmaşıklığını da beraberinde getirir. Kurallarınızı yazarken dikkatli olun, düzenli ifadeleri doğru kullanın ve her zaman değişiklikleri test edin. Mümkün olduğunca sunucu yapılandırma dosyalarını tercih ederek performansı artırın ve gereksiz .htaccess kullanımından kaçının. Bu rehber, mod_rewrite dünyasına adım atmanız için sağlam bir temel oluşturacaktır. Uygulamalı deneyim kazandıkça, bu güçlü modülün tüm potansiyelini keşfedebileceksiniz.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.