Takip et

CentOS 7 Üzerinde Apache için mod_rewrite Kurulumu ve Yapılandırması

CentOS 7 Üzerinde Apache için mod_rewrite Kurulumu ve Yapılandırması Giriş Günümüz web dünyasında, kullanıcı deneyimi, arama motoru opti

CentOS 7 Üzerinde Apache için mod_rewrite Kurulumu ve Yapılandırması

Giriş

Günümüz web dünyasında, kullanıcı deneyimi, arama motoru optimizasyonu (SEO) ve güvenlik, bir web sitesinin başarısı için hayati öneme sahiptir. Bu hedeflere ulaşmada kritik bir rol oynayan araçlardan biri de Apache HTTP Sunucusu’nun güçlü modülü olan mod_rewrite‘dır. mod_rewrite, URL’leri dinamik olarak yeniden yazarak, sunucuya gelen isteklerin farklı bir adrese veya kaynağa yönlendirilmesini sağlar. Bu sayede, karmaşık ve parametrelerle dolu URL’ler yerine, daha temiz, anlamlı ve kullanıcı dostu URL’ler oluşturulabilir. Örneğin, www.example.com/urun.php?id=123 gibi bir adres, www.example.com/urun/123 şeklinde çok daha okunaklı ve akılda kalıcı hale getirilebilir.

CentOS 7 gibi sunucu işletim sistemlerinde Apache ile mod_rewrite‘ı doğru bir şekilde kurmak ve yapılandırmak, web uygulamalarınızın performansını, güvenliğini ve erişilebilirliğini artırmanın temel adımlarından biridir. Bu teknik makalede, CentOS 7 üzerinde Apache için mod_rewrite modülünün nasıl kurulacağını, etkinleştirileceğini ve çeşitli kullanım senaryoları için nasıl yapılandırılacağını adım adım detaylı bir şekilde inceleyeceğiz. Ayrıca, yaygın karşılaşılan sorunları giderme ve performans ipuçları hakkında da bilgi vereceğiz.

Ön Koşullar

mod_rewrite kurulumuna başlamadan önce aşağıdaki ön koşulların yerine getirildiğinden emin olmanız gerekmektedir:

* CentOS 7 İşletim Sistemi: Sunucunuzda CentOS 7’nin kurulu ve güncel olması.
* Apache HTTP Sunucusu (httpd): Apache web sunucusunun kurulu ve çalışır durumda olması. Eğer kurulu değilse, sudo yum install httpd -y komutu ile kurabilirsiniz. Kurulum sonrası sudo systemctl start httpd ve sudo systemctl enable httpd komutları ile başlatıp otomatik başlamasını sağlayın.
* SSH Erişimi: Sunucunuza SSH üzerinden erişebiliyor olmanız.
* Sudo Yetkileri: Kurulum ve yapılandırma adımları için sudo yetkilerine sahip bir kullanıcı.
* Temel Linux Komut Satırı Bilgisi: Dosya düzenleme, servis yönetimi gibi temel komut satırı işlemlerine aşina olmak.

Apache ve mod_rewrite Durumunu Kontrol Etme

mod_rewrite yapılandırmasına başlamadan önce, Apache servisinin çalıştığından ve mod_rewrite modülünün halihazırda yüklü olup olmadığını kontrol etmek önemlidir.

İlk olarak, Apache HTTP sunucusunun durumunu kontrol edelim:

sudo systemctl status httpd

Çıktıda Active: active (running) ifadesini görmeniz gerekmektedir. Eğer çalışmıyorsa, sudo systemctl start httpd komutu ile başlatın.

Ardından, mod_rewrite modülünün Apache tarafından yüklenip yüklenmediğini kontrol edelim. Çoğu CentOS 7 Apache kurulumunda mod_rewrite varsayılan olarak gelir, ancak etkinleştirilmesi gerekebilir.

sudo httpd -M | grep rewrite_module

Eğer çıktı olarak rewrite_module (shared) gibi bir satır görüyorsanız, mod_rewrite modülü zaten yüklü ve Apache tarafından tanınıyor demektir. Bu durumda, bir sonraki adıma geçebilirsiniz. Eğer herhangi bir çıktı görmezseniz veya modülün yüklü olmadığını düşünüyorsanız, bir sonraki adıma geçerek etkinleştirme işlemini gerçekleştirmemiz gerekecektir.

mod_rewrite Modülünü Etkinleştirme (Gerekliyse)

Eğer önceki adımda rewrite_module‘ı göremediyseniz veya emin olmak istiyorsanız, Apache’nin ana yapılandırma dosyasına veya modül yapılandırma dizinine bakmamız gerekmektedir.

Apache’nin ana yapılandırma dosyası /etc/httpd/conf/httpd.conf konumundadır. Ayrıca, modüller genellikle /etc/httpd/conf.modules.d/ dizinindeki .conf uzantılı dosyalarda tanımlanır.

Tercih edilen yol, mod_rewrite‘ın 00-base.conf veya benzeri bir dosyada tanımlı olup olmadığını kontrol etmektir.

grep -i "rewrite_module" /etc/httpd/conf.modules.d/*.conf

Bu komut, rewrite_module satırını arayacaktır. Genellikle şöyle bir satır bulacaksınız:

LoadModule rewrite_module modules/mod_rewrite.so

Eğer bu satırı bulursanız ve başında # işareti yoksa (yani yorum satırı değilse), modül zaten etkinleştirilmiştir. Eğer satırın başında # işareti varsa, bu işareti kaldırarak modülü etkinleştirmeniz gerekir.

Eğer bu satırı hiçbir dosyada bulamazsanız, /etc/httpd/conf/httpd.conf dosyasını bir metin düzenleyici ile açarak (örneğin vi veya nano) bu satırı eklemeniz gerekebilir.

sudo vi /etc/httpd/conf/httpd.conf

Dosyayı açtıktan sonra, LoadModule direktiflerinin bulunduğu bölüme giderek aşağıdaki satırı ekleyin veya yorum satırı ise # işaretini kaldırın:

LoadModule rewrite_module modules/mod_rewrite.so

Değişiklikleri kaydettikten sonra, Apache servisini yeniden başlatmanız gerekmektedir ki değişiklikler uygulansın:

sudo systemctl restart httpd

Yeniden başlatmanın ardından, sudo httpd -M | grep rewrite_module komutunu tekrar çalıştırarak modülün başarıyla yüklendiğini teyit edebilirsiniz.

Apache Yapılandırmasında Rewrite Kurallarına İzin Verme

mod_rewrite modülünü etkinleştirmek, URL yeniden yazma kurallarını kullanabilmeniz için yeterli değildir. Apache’nin, .htaccess dosyaları veya blokları içinde tanımlanan yeniden yazma kurallarını işlemesine izin vermesi gerekir. Bu izin, AllowOverride direktifi ile kontrol edilir.

CentOS 7’de Apache’nin varsayılan yapılandırmasında, genellikle /var/www/html dizini için AllowOverride None olarak ayarlanmıştır. Bu ayar, ilgili dizin ve alt dizinlerdeki .htaccess dosyalarının Apache tarafından dikkate alınmamasını sağlar. mod_rewrite kurallarının çalışabilmesi için bu değeri en azından AllowOverride FileInfo veya AllowOverride All olarak değiştirmemiz gerekmektedir.

AllowOverride Direktifi Nedir?
AllowOverride direktifi, belirli bir dizin için .htaccess dosyalarında hangi direktif türlerinin kullanılabileceğini belirler.

* AllowOverride None: .htaccess dosyaları tamamen göz ardı edilir. Performans açısından en iyisidir, ancak esnekliği kısıtlar.
* AllowOverride All: Tüm Apache direktifleri .htaccess dosyalarında kullanılabilir. En esnek seçenektir, ancak performans üzerinde hafif bir etkisi olabilir ve güvenlik riskleri taşıyabilir (özellikle paylaşımlı barındırma ortamlarında).
* AllowOverride FileInfo: mod_rewrite direktifleri (RewriteEngine, RewriteRule, RewriteCond), ErrorDocument ve DefaultType gibi dosya türü ve belge bilgisi ile ilgili direktiflerin kullanımına izin verir. mod_rewrite için genellikle yeterli ve önerilen ayardır.
* Diğer seçenekler: AuthConfig, Indexes, Limit, Options belirli direktif türlerini etkinleştirir.

Yapılandırma Dosyasını Düzenleme
Apache’nin ana yapılandırma dosyası olan /etc/httpd/conf/httpd.conf dosyasını düzenlememiz gerekecek.

sudo vi /etc/httpd/conf/httpd.conf

Dosyayı açtıktan sonra, web sitenizin belge kök dizinini (DocumentRoot) belirten bloğunu bulmanız gerekmektedir. Çoğu durumda bu /var/www/html dizinidir.

Aşağıdaki bloğu arayın:


    AllowOverride None

Bu satırı aşağıdaki gibi değiştirin:


    AllowOverride All

veya sadece mod_rewrite için yeterli olan:


    AllowOverride FileInfo

Sanal Host (Virtual Host) Yapılandırmaları İçin
Eğer web siteniz için bir sanal host yapılandırması kullanıyorsanız (ki bu genellikle tavsiye edilen bir yöntemdir), bu değişikliği ilgili sanal host dosyasında (örneğin /etc/httpd/conf.d/vhost.conf veya /etc/httpd/conf.d/yourdomain.conf) yapmanız gerekecektir. Sanal host yapılandırması genellikle aşağıdaki gibi görünür:


    ServerName yourdomain.com
    DocumentRoot /var/www/html/yourdomain

    
        AllowOverride All
        Require all granted
    

    ErrorLog /var/log/httpd/yourdomain-error.log
    CustomLog /var/log/httpd/yourdomain-access.log combined

Bu durumda, bloğu içindeki AllowOverride None değerini AllowOverride All veya AllowOverride FileInfo olarak değiştirmelisiniz.

Değişiklikleri kaydettikten sonra, Apache yapılandırmasının sözdizimini kontrol etmek iyi bir uygulamadır:

sudo apachectl configtest

Eğer çıktı Syntax OK ise, Apache servisini yeniden başlatabilirsiniz:

sudo systemctl restart httpd

Artık Apache, web sitenizin kök dizinindeki .htaccess dosyalarında veya ilgili bloklarında tanımlanan mod_rewrite kurallarını işleyebilecektir.

.htaccess Dosyası Oluşturma ve Rewrite Kuralları Yazma

mod_rewrite‘ın gücünü kullanmak için web sitenizin belge kök dizinine (DocumentRoot) bir .htaccess dosyası oluşturmanız ve içine yeniden yazma kurallarını yazmanız gerekir. Belge kök dizini genellikle /var/www/html veya sanal host yapılandırmanıza göre değişen bir dizindir.

Örnek olarak, /var/www/html dizininde bir .htaccess dosyası oluşturalım:

sudo vi /var/www/html/.htaccess

Her .htaccess dosyasının başına RewriteEngine On direktifini eklemek zorunludur. Bu direktif, mod_rewrite motorunu etkinleştirir.

# .htaccess içeriği
RewriteEngine On

Diğer Rewrite kuralları buraya gelecek

Şimdi, yaygın kullanılan bazı mod_rewrite kurallarını inceleyelim:

Kullanıcı Dostu URL’ler (Friendly URLs)

Bu, mod_rewrite‘ın en yaygın kullanım alanlarından biridir. Dinamik bir sayfa adresini (örneğin, urun.php?id=123) daha temiz bir adrese (örneğin, urun/123) dönüştürmek.

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

Açıklama:
* RewriteRule: Bir yeniden yazma kuralı tanımlar.
* ^urun/([0-9]+)/?$: Gelen URL desenini (Pattern) tanımlayan düzenli ifadedir.
* ^: Satırın başlangıcı.
* urun/: “urun/” kelimesiyle eşleşir.
* ([0-9]+): Bir veya daha fazla rakamdan oluşan bir grubu yakalar ve bunu $1 değişkenine atar.
* /?: İsteğe bağlı bir eğik çizgi (slash) ile eşleşir.
* $: Satırın sonu.
* urun.php?id=$1: Hedef URL’dir (Substitution). Yakalanan rakam $1 ile urun.php sayfasına id parametresi olarak iletilir.
* [NC,L]: Bayraklar (Flags).
* NC (No Case): Büyük/küçük harf duyarsız eşleşme.
* L (Last): Bu kural eşleştiğinde, Apache diğer yeniden yazma kurallarını işlemeyi durdurur.

WWW Olmayan Alan Adından WWW’ye Yönlendirme (Non-WWW to WWW Redirection)

Web sitenizin www.example.com yerine example.com üzerinden erişildiğinde, otomatik olarak www‘li versiyona yönlendirilmesini sağlamak SEO için önemlidir.

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [L,R=301]

Açıklama:
* RewriteCond %{HTTP_HOST} !^www\. [NC]: Bir koşul tanımlar.
* %{HTTP_HOST}: Gelen isteğin host adını (örneğin example.com) alır.
* !^www\.: Host adının www. ile başlamadığını kontrol eder (! olumsuzluk işaretidir).
* [NC]: Büyük/küçük harf duyarsız.
RewriteRule ^(.)$ http://www.%{HTTP_HOST}/$1 [L,R=301]: Eğer koşul doğruysa bu kuralı uygular.
^(.)$: Gelen URL’nin tamamını yakalar ($1).
* http://www.%{HTTP_HOST}/$1: Yakalanan URL’yi www. ile başlayan host adına yönlendirir.
* [L,R=301]:
* L (Last): Son kural.
* R=301 (Permanent Redirect): Kalıcı bir 301 yönlendirmesi yapar. Bu, arama motorları için önemlidir.

HTTP’den HTTPS’ye Yönlendirme (HTTP to HTTPS Redirection)

Güvenli bir bağlantı (HTTPS) kullanmak modern web siteleri için bir standarttır. Tüm HTTP isteklerini HTTPS’ye yönlendirmek için:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Açıklama:
* RewriteCond %{HTTPS} off: Gelen isteğin HTTPS olmadığını kontrol eder.
RewriteRule ^(.)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]: Eğer koşul doğruysa, isteği HTTPS versiyonuna yönlendirir.
* %{REQUEST_URI}: Gelen isteğin URI’sini (örneğin /index.html veya /urun/123) alır.

Dosya Uzantısını Gizleme (Hiding File Extensions)

example.com/hakkimizda.php yerine example.com/hakkimizda gibi daha temiz URL’ler oluşturmak.

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/?$ $1.php [L]

Açıklama:
* RewriteCond %{REQUEST_FILENAME} !-f: İstenen URI’nin fiziksel olarak var olan bir dosya olmadığını kontrol eder.
* RewriteCond %{REQUEST_FILENAME} !-d: İstenen URI’nin fiziksel olarak var olan bir dizin olmadığını kontrol eder.
* RewriteRule ^([^/]+)/?$ $1.php [L]: Eğer yukarıdaki koşullar doğruysa, gelen URI’yi yakalar ve sonuna .php ekleyerek dahili olarak yeniden yazar.

Belirli IP Adreslerinden Erişimi Engelleme (Blocking IP Addresses)

Belirli IP adreslerinden gelen erişimi engellemek için mod_rewrite kullanılabilir, ancak genellikle mod_authz_host modülü bu tür işlemler için daha uygundur. Yine de bir örnek:

RewriteEngine On
RewriteCond %{REMOTE_ADDR} ^192\.168\.1\.100$ [OR]
RewriteCond %{REMOTE_ADDR} ^10\.0\.0\.50$
RewriteRule .* - [F]

Açıklama:
* RewriteCond %{REMOTE_ADDR} ^192\.168\.1\.100$ [OR]: Gelen isteğin IP adresinin 192.168.1.100 olduğunu kontrol eder veya (OR)
* RewriteCond %{REMOTE_ADDR} ^10\.0\.0\.50$: IP adresinin 10.0.0.50 olduğunu kontrol eder.
RewriteRule . - [F]: Eğer koşullardan biri doğruysa, isteği yasaklar (F – Forbidden bayrağı 403 hatası döndürür). - (tire) hedef URL olmadığı anlamına gelir.

Eski URL’lerden Yeni URL’lere Yönlendirme (Old to New URL Redirects)

Web sitenizin yapısını değiştirdiğinizde veya bir sayfayı taşıdığınızda, eski URL’lerden yeni URL’lere kalıcı yönlendirmeler yapmak SEO için kritik öneme sahiptir.

RewriteEngine On
RewriteRule ^eski-sayfa\.html$ /yeni-sayfa/ [R=301,L]
RewriteRule ^eski-dizin/(.*)$ /yeni-dizin/$1 [R=301,L]

Açıklama:
* İlk kural, tam bir eski sayfa adını yeni bir dizine yönlendirir.
* İkinci kural, eski bir dizindeki tüm içeriği yeni bir dizine yönlendirir. $1 yakalanan tüm alt dizin ve dosya yolunu temsil eder.

Bu örnekleri kendi ihtiyaçlarınıza göre uyarlayarak veya birleştirerek karmaşık yeniden yazma kuralları oluşturabilirsiniz. Her değişiklikten sonra .htaccess dosyasını kaydetmeyi unutmayın. Apache’yi yeniden başlatmaya gerek yoktur çünkü .htaccess dosyaları her istekte yeniden okunur (eğer AllowOverride etkinse).

Rewrite Kurallarının Söz Dizimi ve Temel Bileşenleri

mod_rewrite kuralları, güçlü ve esnek düzenli ifadeler (Regular Expressions) kullanır. Kuralları doğru yazmak için temel bileşenleri ve bayrakları anlamak önemlidir.

RewriteEngine

* RewriteEngine On|Off: mod_rewrite motorunu etkinleştirir veya devre dışı bırakır. Her .htaccess dosyasının veya bloğunun başında On olarak ayarlanmalıdır.

RewriteBase

* RewriteBase /path/: Eğer .htaccess dosyanız web sunucusunun belge kök dizininin bir alt dizinindeyse, RewriteBase direktifi, yeniden yazma kurallarının temel URL yolunu belirtmek için kullanılır. Genellikle RewriteBase / olarak ayarlanır. Bu, yeniden yazma kurallarındaki hedef URL’lerin (Substitution) belge kök dizinine göre mutlak yol olarak yorumlanmasını sağlar.

RewriteCond (Yeniden Yazma Koşulu)

* RewriteCond TestString CondPattern [Flags]: Bir RewriteRule‘un uygulanabilmesi için bir veya daha fazla koşul tanımlar. Bir RewriteRule‘dan önce gelen tüm RewriteCond‘lar, varsayılan olarak AND (ve) mantıksal operatörü ile birleştirilir.
* TestString: Kontrol edilecek dize. Genellikle sunucu değişkenleri (%{HTTP_HOST}, %{REQUEST_URI}, %{REMOTE_ADDR}, %{HTTPS}, %{REQUEST_FILENAME} vb.) kullanılır.
* CondPattern: TestString ile eşleştirilecek düzenli ifade deseni.
* [Flags]: Koşula özel bayraklar.
* [NC] (No Case): Büyük/küçük harf duyarsız eşleşme.
* [OR] (Or): Bir sonraki RewriteCond ile bu koşulu OR operatörü ile birleştirir.
* [L] (Last): Bu koşul doğruysa, diğer koşulları kontrol etmeyi durdurur.

RewriteRule (Yeniden Yazma Kuralı)

* RewriteRule Pattern Substitution [Flags]: Gelen URL’yi (Pattern) belirli bir hedefe (Substitution) yeniden yazan ana kuraldır.
* Pattern: Gelen URL yolunu eşleştirmek için kullanılan düzenli ifade.
* Substitution: Pattern ile eşleşen URL’nin yeniden yazılacağı hedef URL veya dosya yolu. Düzenli ifadedeki yakalanan gruplar ((...)) burada $1, $2 vb. şeklinde kullanılabilir.
* [Flags]: Kuralın davranışını değiştiren bayraklar. En yaygın olanları:
* L (Last): Bu kural eşleştiğinde, mod_rewrite işlemeyi durdurur ve diğer kuralları atlar.
* R veya R=301|302|... (Redirect): Tarayıcıya bir HTTP yönlendirmesi gönderir. R varsayılan olarak 302 (geçici) yönlendirme yapar. R=301 kalıcı yönlendirme için kullanılır.
* NC (No Case): Düzenli ifade eşleşmesini büyük/küçük harf duyarsız yapar.
* QSA (Query String Append): Eğer hedef URL’de bir sorgu dizesi yoksa, orijinal isteğin sorgu dizesini ekler.
* NE (No Escape): Çıktıdaki özel karakterlerin (örneğin boşluklar, Türkçe karakterler) URL kodlamasını engeller.
* F (Forbidden): Eşleşen URL’ye erişimi yasaklar (403 Forbidden hatası).
* P (Proxy): Hedef URL’yi dahili olarak bir proxy isteği olarak işler. mod_proxy‘nin etkin olması gerekir.
* PT (Pass Through): RewriteRule‘dan sonraki işleme devam eder, yani Apache’nin normal dosya/dizin eşleştirme mekanizmasını kullanır. Özellikle mod_alias veya mod_autoindex gibi diğer modüllerle etkileşimde önemlidir.
* E=VAR:VALUE (Env): Ortam değişkeni ayarlar.

Düzenli İfadeler (Regular Expressions)

mod_rewrite‘ın gücü, düzenli ifadelerin doğru kullanımıyla ortaya çıkar. Bazı temel düzenli ifade karakterleri:
* .: Herhangi bir tek karakter (satır sonu hariç).
: Önceki karakterin sıfır veya daha fazla tekrarı.
* +: Önceki karakterin bir veya daha fazla tekrarı.
* ?: Önceki karakterin sıfır veya bir tekrarı (isteğe bağlı).
* ^: Satırın başlangıcı.
* $: Satırın sonu.
* [abc]: a, b veya c karakterlerinden biri.
* [0-9]: Herhangi bir rakam.
* [a-zA-Z]: Herhangi bir harf.
* [^abc]: a, b veya c dışındaki herhangi bir karakter.
* (pattern): Yakalama grubu. Eşleşen kısmı $1, $2 vb. değişkenlerde saklar.
* |: Veya (alternatif).
* \ (ters eğik çizgi): Özel karakterleri kaçış karakteri olarak kullanır (örn. \. bir nokta karakteriyle eşleşir).

Hata Ayıklama ve Sorun Giderme

mod_rewrite kuralları oldukça güçlü olabilir, ancak yanlış yapılandırıldığında web sitenizin erişilemez hale gelmesine neden olabilir. Hata ayıklama adımları bu süreçte kritik öneme sahiptir.

1. Apache Hata Günlüklerini Kontrol Edin

Apache’nin hata günlükleri, mod_rewrite ile ilgili sorunları tespit etmenin ilk ve en önemli yeridir.

sudo tail -f /var/log/httpd/error_log

Bu komut, hata günlüğünü gerçek zamanlı olarak izlemenizi sağlar. Bir istek gönderdiğinizde ve beklenen davranış gerçekleşmediğinde, burada ilgili hata mesajlarını görebilirsiniz.

2. RewriteLog ve RewriteLogLevel (Apache 2.2 ve Öncesi) / LogLevel (Apache 2.4 ve Sonrası)

Apache 2.4 ve sonraki sürümlerde RewriteLog ve RewriteLogLevel direktifleri kaldırılmıştır. Bunun yerine, LogLevel direktifi kullanılır ve rewrite modülü için özel izleme seviyeleri ayarlanabilir.

/etc/httpd/conf/httpd.conf dosyasını açın:

sudo vi /etc/httpd/conf/httpd.conf

LogLevel direktifini bulun ve aşağıdaki gibi değiştirin (veya ekleyin):

LogLevel debug rewrite:trace8

* debug: Genel hata ayıklama mesajlarını etkinleştirir.
* rewrite:trace8: mod_rewrite için en yüksek izleme seviyesini (8) etkinleştirir. Bu, mod_rewrite‘ın her adımı, koşul kontrolü ve kural eşleşmesi hakkında ayrıntılı bilgi sağlayacaktır.

Değişikliği kaydettikten sonra Apache’yi yeniden başlatın:

sudo systemctl restart httpd

Şimdi, /var/log/httpd/error_log dosyasını tekrar izleyin ve web sitenize bir istek gönderin. Günlüklerde [rewrite:traceX] ile başlayan çok sayıda ayrıntılı bilgi göreceksiniz. Bu bilgiler, hangi kuralların eşleştiğini, hangi koşulların doğru/yanlış olduğunu ve URL’nin nasıl yeniden yazıldığını anlamanıza yardımcı olacaktır. Hata ayıklama bittiğinde LogLevel‘ı eski değerine (warn veya info) geri almayı unutmayın, çünkü yüksek izleme seviyeleri sunucu performansını olumsuz etkiler ve çok fazla disk alanı tüketebilir.

3. apachectl configtest

Yapılandırma dosyalarınızda (özellikle httpd.conf veya sanal host dosyaları) sözdizimi hataları olup olmadığını kontrol edin:

sudo apachectl configtest

Syntax OK çıktısı alana kadar sözdizimi hatalarını düzeltin. .htaccess dosyaları için bu kontrol geçerli değildir, çünkü bunlar dinamik olarak okunur.

4. Tarayıcı Önbelleği

Tarayıcılar, özellikle 301 yönlendirmeleri gibi durumlarda, eski yönlendirmeleri önbelleğe alabilir. Bu, yaptığınız değişikliklerin hemen görünmemesine neden olabilir. Tarayıcı önbelleğini temizlemeyi veya gizli (incognito) modda test etmeyi deneyin. Zorunlu yenileme (Ctrl+F5 veya Cmd+Shift+R) de yardımcı olabilir.

5. AllowOverride Kontrolü

mod_rewrite kurallarınızın çalışmamasının en yaygın nedenlerinden biri, AllowOverride direktifinin doğru ayarlanmamış olmasıdır. Belge kök dizini veya sanal host yapılandırmanızdaki bloğunda AllowOverride All veya AllowOverride FileInfo olarak ayarlandığından emin olun ve Apache’yi yeniden başlatın.

6. .htaccess Dosyasının Konumu ve İzinleri

.htaccess dosyasının web sitenizin belge kök dizininde veya alt dizininde olduğundan emin olun. Ayrıca, Apache kullanıcısının bu dosyayı okuma iznine sahip olduğundan emin olun (chmod 644 .htaccess).

7. SELinux ve Firewalld

Nadiren de olsa, SELinux veya Firewalld ayarları Apache’nin düzgün çalışmasını engelleyebilir.
* SELinux: setsebool -P httpd_can_network_connect on gibi komutlarla belirli SELinux politikalarını ayarlamanız gerekebilir. sudo getenforce ile SELinux’un durumunu kontrol edebilir (Enforcing, Permissive, Disabled). sudo tail -f /var/log/audit/audit.log komutuyla SELinux günlüklerini inceleyebilirsiniz.
* Firewalld: Eğer Apache varsayılan HTTP (80) veya HTTPS (443) portlarında çalışmıyorsa veya harici kaynaklara erişmesi gerekiyorsa, Firewalld’da ilgili portların açık olduğundan emin olun. sudo firewall-cmd --list-all ile mevcut kuralları görebilirsiniz.

Performans Konuları ve Güvenlik

mod_rewrite güçlü bir araçtır, ancak doğru kullanılmadığında performans sorunlarına veya güvenlik açıklarına yol açabilir.

Performans Etkisi

* .htaccess Dosyaları: Apache, her gelen istek için, istek yapılan dizinden başlayarak kök dizine kadar tüm .htaccess dosyalarını okur ve işler. Bu durum, özellikle çok sayıda .htaccess dosyası olan veya karmaşık kurallar içeren sitelerde önemli bir performans yükü oluşturabilir. Mümkünse, mod_rewrite kurallarını doğrudan ana Apache yapılandırma dosyalarına (örneğin /etc/httpd/conf/httpd.conf veya sanal host yapılandırma dosyalarına) taşımak performansı artırır. Bu, Apache’nin kuralları yalnızca bir kez, başlangıçta yüklemesini sağlar.
* Düzenli İfadelerin Karmaşıklığı: Karmaşık ve verimsiz düzenli ifadeler, Apache’nin CPU kullanımını artırabilir. Basit ve optimize edilmiş düzenli ifadeler kullanmaya özen gösterin. Gereksiz yakalama gruplarından veya geriye dönük referanslardan kaçının.
* Bayrak Kullanımı: L (Last) bayrağını doğru kullanmak, gereksiz kural işlemeyi durdurarak performansı artırabilir. NC (No Case) gibi bayraklar da küçük bir performans maliyeti ekler.

Güvenlik Hususları

* Açık Yönlendirmeler: Yanlış yapılandırılmış RewriteRule‘lar, saldırganların kullanıcıları kötü niyetli sitelere yönlendirmesine olanak tanıyan “açık yönlendirme” (open redirect) zafiyetlerine yol açabilir. Hedef URL’leri oluştururken dikkatli olun ve kullanıcı tarafından sağlanan girdileri doğrudan güvenmeden kullanmayın.
* Dizin Listeleme ve Hassas Bilgi Sızdırma: mod_rewrite‘ın kendisi doğrudan dizin listeleme ile ilgili değildir, ancak yanlış yapılandırılmış bir .htaccess dosyası, Options -Indexes gibi güvenlik direktiflerini geçersiz kılarak veya hassas dosyaların doğrudan erişimine izin vererek dolaylı güvenlik riskleri oluşturabilir.
* DoS Saldırıları: Aşırı karmaşık veya döngüsel mod_rewrite kuralları, sunucuyu DoS (Denial of Service) saldırılarına karşı savunmasız hale getirebilir. Sunucu, bir isteği işlemek için çok fazla kaynak harcayabilir ve sonuç olarak meşru isteklere yanıt veremeyebilir.

Güvenlik ve performans için en iyi uygulama, mod_rewrite kurallarını, mümkün olduğunca, sanal host yapılandırmaları içinde veya ana sunucu yapılandırmasında tutmaktır. .htaccess dosyaları, özellikle paylaşımlı barındırma ortamlarında, esneklik sağlarken potansiyel güvenlik ve performans risklerini de beraberinde getirir.

Sonuç

CentOS 7 üzerinde Apache için mod_rewrite‘ı kurmak ve yapılandırmak, web sitelerinizin ve uygulamalarınızın modern web standartlarına uyum sağlaması için temel bir adımdır. Bu güçlü modül, URL’leri yeniden yazarak SEO’yu iyileştirmenize, kullanıcı dostu URL’ler oluşturmanıza, güvenliği artırmanıza ve sitenizin genel esnekliğini önemli ölçüde artırmanıza olanak tanır.

Bu makalede adım adım mod_rewrite‘ın nasıl etkinleştirileceğini, Apache’nin bu kuralları işlemesine nasıl izin verileceğini ve yaygın kullanım senaryoları için çeşitli yeniden yazma kurallarının nasıl yazılacağını detaylı bir şekilde ele aldık. Ayrıca, karmaşık kuralların sözdizimi, hata ayıklama teknikleri ve performans ile güvenlik konularına da değindik.

Unutmayın ki mod_rewrite kuralları oldukça güçlü olduğundan, her değişikliği dikkatlice test etmek ve Apache hata günlüklerini düzenli olarak kontrol etmek kritik öneme sahiptir. Doğru yapılandırıldığında, mod_rewrite web geliştiricileri için vazgeçilmez bir araç haline gelir ve web sitenizin internet üzerindeki varlığını önemli ölçüde güçlendirir. Bu rehberin, CentOS 7 sunucunuzda mod_rewrite‘ı başarılı bir şekilde yapılandırmanıza yardımcı olacağını umuyoruz.

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.