Apache mod_speling ile URL Yazım Hatalarını Otomatik Düzeltme

Kullanıcıların URL’leri her zaman doğru yazmadığı bir gerçek. “hakkimizda” yerine “hakkkmizda”, “iletisim” yerine “iletişim” gibi küçük yazım hataları, ziyaretçilerin 404 sayfasıyla karşılaşmasına ve sitenizi terk etmesine neden olabilir. Apache’nin mod_speling modülü tam da bu sorunu çözmek için tasarlanmış, göz ardı edilen ama son derece kullanışlı bir araçtır.

mod_speling Nedir ve Nasıl Çalışır?

mod_speling, Apache HTTP Server’ın standart modülleri arasında gelen, URL yazım hatalarını otomatik olarak düzelten bir modüldür. Modülün adındaki yazım hatası (“spelling” yerine “speling”) kasıtlıdır ve biraz ironi içerir.

Modül şu durumlarda devreye girer:

  • Tek karakter eksikliği veya fazlalığı olan URL’ler
  • Büyük/küçük harf uyumsuzlukları (/Hakkimizda yerine /hakkimizda gibi)
  • Tek karakter transpozisyonu (iki karakterin yerinin değişmesi)
  • Tek karakter ikamesi (yanlış karakter kullanımı)

Bir istek geldiğinde ve sunucu dosyayı bulamazsa, mod_speling ilgili dizindeki dosyaları tarar, benzer isimleri karşılaştırır ve eğer tek bir yakın eşleşme bulursa otomatik olarak 301 yönlendirmesi yapar. Birden fazla olası eşleşme varsa kullanıcıya seçenekler sunulur.

Kurulum ve Etkinleştirme

Ubuntu/Debian Sistemlerde

Ubuntu ve Debian tabanlı sistemlerde mod_speling genellikle Apache ile birlikte gelir ancak etkin değildir. Etkinleştirmek için:

sudo a2enmod speling
sudo systemctl restart apache2

Modülün yüklenip yüklenmediğini doğrulamak için:

apache2ctl -M | grep speling

Çıktıda speling_module (shared) görüyorsanız modül başarıyla yüklenmiştir.

CentOS/RHEL/AlmaLinux Sistemlerde

Red Hat tabanlı sistemlerde modül genellikle /etc/httpd/conf.modules.d/ dizinindeki yapılandırma dosyalarından yönetilir:

# Mevcut modül dosyalarını kontrol et
ls /etc/httpd/conf.modules.d/

# mod_speling'in yüklenip yüklenmediğini kontrol et
grep -r "mod_speling" /etc/httpd/conf.modules.d/

Eğer modül yüklü değilse, 00-base.conf veya yeni bir dosya oluşturarak ekleyebilirsiniz:

echo "LoadModule speling_module modules/mod_speling.so" | sudo tee /etc/httpd/conf.modules.d/00-speling.conf
sudo systemctl restart httpd

Manuel Derleme ile Kurulum

Eğer Apache’yi kaynak koddan derlediyseniz, modülü apxs ile ekleyebilirsiniz:

# Apache kaynak kodunun olduğu dizinde
cd /usr/src/apache2/modules/mappers/
sudo apxs -c -i mod_speling.c
sudo systemctl restart apache2

Temel Yapılandırma

mod_speling‘i etkinleştirdikten sonra yapılandırmanız gerekir. Modül varsayılan olarak pasiftir, yani yüklenmiş olması tek başına yeterli değildir.

Sunucu Genelinde Etkinleştirme

Ana Apache yapılandırma dosyasına (httpd.conf veya apache2.conf) ekleyin:

# /etc/apache2/apache2.conf veya /etc/httpd/conf/httpd.conf
<IfModule mod_speling.c>
    CheckSpelling On
    CheckCaseOnly Off
</IfModule>

CheckSpelling On: Modülü etkinleştirir. CheckCaseOnly Off: Sadece büyük/küçük harf düzeltmesi değil, tüm yazım hatası düzeltmelerini aktif eder. On yaparsanız yalnızca harf büyüklüğü hatalarını düzeltir.

VirtualHost Bazlı Yapılandırma

Genellikle önerilen yaklaşım, modülü belirli bir sanal sunucuya özel etkinleştirmektir:

<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /var/www/example

    <IfModule mod_speling.c>
        CheckSpelling On
        CheckCaseOnly Off
    </IfModule>

    <Directory /var/www/example>
        Options FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/example_error.log
    CustomLog ${APACHE_LOG_DIR}/example_access.log combined
</VirtualHost>

.htaccess ile Dizin Bazlı Yapılandırma

Eğer sunucu yapılandırmasına erişiminiz yoksa veya belirli dizinler için farklı davranış istiyorsanız .htaccess kullanabilirsiniz. Bunun çalışması için AllowOverride direktifinin All veya en azından Options içermesi gerekir:

# .htaccess dosyası
Options +FollowSymLinks
CheckSpelling On
CheckCaseOnly Off

Gerçek Dünya Senaryoları

Senaryo 1: Kurumsal Web Sitesi URL Yönetimi

Bir kurumun web sitesinde onlarca sayfa bulunuyor ve çalışanlar iç e-postalarda zaman zaman URL’leri yanlış yazıyor. IT departmanı her seferinde yönlendirme kuralı eklemek yerine mod_speling‘i kullanmaya karar veriyor.

<VirtualHost *:443>
    ServerName sirket.com.tr
    DocumentRoot /var/www/sirket

    <IfModule mod_speling.c>
        CheckSpelling On
        CheckCaseOnly Off
    </IfModule>

    # SSL yapılandırması
    SSLEngine on
    SSLCertificateFile /etc/ssl/certs/sirket.crt
    SSLCertificateKeyFile /etc/ssl/private/sirket.key

    <Directory /var/www/sirket>
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

Bu yapılandırmayla /Hakkimizda, /hakkimizzda veya /HakkiMizda gibi yanlış URL’ler otomatik olarak /hakkimizda adresine yönlendirilecek.

Senaryo 2: Büyük/Küçük Harf Sorunları

Özellikle Windows’tan Linux’a geçen sistemlerde, Windows’ta büyük/küçük harf duyarsız olan dosya sistemi nedeniyle oluşan URL alışkanlıkları sorun yaratabilir. Sadece harf büyüklüğü düzeltmesi istiyorsanız:

<Directory /var/www/html/urunler>
    <IfModule mod_speling.c>
        CheckSpelling On
        CheckCaseOnly On
    </IfModule>
</Directory>

Bu konfigürasyonla /Urunler/Laptop gibi bir istek /urunler/laptop olarak düzeltilir ancak /urunlerr/laptop gibi ekstra karakter hataları düzeltilmez.

Senaryo 3: Birden Fazla Eşleşme Durumu

mod_speling birden fazla olası dosya bulduğunda, kullanıcıya seçenekler sunan bir HTML listesi döner. Bu sayfanın görünümü varsayılan olarak pek kullanıcı dostu değildir. Bu durumu özel hata sayfalarıyla yönetmek daha iyi bir kullanıcı deneyimi sağlar:

<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /var/www/example

    <IfModule mod_speling.c>
        CheckSpelling On
        CheckCaseOnly Off
    </IfModule>

    # Özel hata sayfaları
    ErrorDocument 404 /ozel-hata-404.html
    ErrorDocument 300 /secenekler.html

    <Directory /var/www/example>
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

Performans Değerlendirmesi ve Optimizasyon

mod_speling‘in en önemli dezavantajı, her başarısız istek için dizin içeriğini okuması ve karşılaştırma yapmasıdır. Çok sayıda dosya içeren dizinlerde bu işlem gecikmeye neden olabilir.

Modülü Belirli Dizinlerle Sınırlandırma

Performans sorunlarını önlemek için modülü yalnızca gerekli dizinlerde etkinleştirin:

<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /var/www/example

    # Varsayılan olarak kapalı tut
    <IfModule mod_speling.c>
        CheckSpelling Off
    </IfModule>

    # Sadece gerekli dizinlerde aç
    <Directory /var/www/example/sayfalar>
        <IfModule mod_speling.c>
            CheckSpelling On
            CheckCaseOnly Off
        </IfModule>
    </Directory>

    <Directory /var/www/example/haberler>
        <IfModule mod_speling.c>
            CheckSpelling On
            CheckCaseOnly On
        </IfModule>
    </Directory>
</VirtualHost>

Statik Dosyaları Hariç Tutma

Resimler, CSS, JavaScript gibi statik varlıklar için mod_speling‘e gerek yoktur. Bu dosyaları hariç tutmak performansı artırır:

<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /var/www/example

    <IfModule mod_speling.c>
        CheckSpelling On
        CheckCaseOnly Off
    </IfModule>

    # Statik dosyalar için kapalı tut
    <Directory /var/www/example/assets>
        <IfModule mod_speling.c>
            CheckSpelling Off
        </IfModule>
    </Directory>

    <FilesMatch ".(jpg|jpeg|png|gif|css|js|ico|woff|woff2|ttf|svg)$">
        <IfModule mod_speling.c>
            CheckSpelling Off
        </IfModule>
    </FilesMatch>
</VirtualHost>

mod_speling ile mod_rewrite Birlikte Kullanımı

Bazı durumlarda mod_rewrite ile birlikte kullanmak daha güçlü bir URL yönetimi sağlar. Ancak bu iki modülün çalışma sırasına dikkat etmek gerekir:

<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /var/www/example

    <IfModule mod_rewrite.c>
        RewriteEngine On
        # Önce özel yönlendirme kuralları işlenir
        RewriteRule ^eski-sayfa$ /yeni-sayfa [R=301,L]
    </IfModule>

    # mod_speling sonra devreye girer
    <IfModule mod_speling.c>
        CheckSpelling On
        CheckCaseOnly Off
    </IfModule>

    <Directory /var/www/example>
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

Önemli not: mod_rewrite kuralları mod_speling‘den önce işlenir. Dolayısıyla mod_rewrite ile eşleşen istekler mod_speling‘e ulaşmaz.

Logları İzleme ve Sorun Giderme

mod_speling‘in nasıl çalıştığını anlamak ve sorunları tespit etmek için log seviyesini artırabilirsiniz:

# Apache log seviyesini geçici olarak artır
sudo apachectl -e debug

# Veya yapılandırmada:
LogLevel warn speling:debug

Erişim loglarında yapılan yönlendirmeleri görmek için:

# 301 yönlendirmelerini filtrele
sudo tail -f /var/log/apache2/access.log | grep " 301 "

# mod_speling tarafından yapılan yönlendirmeleri izle
sudo grep "spelling" /var/log/apache2/error.log

Modülün çalışıp çalışmadığını test etmek için curl kullanabilirsiniz:

# Kasıtlı yanlış URL ile test
curl -I http://example.com/hakkimizzda

# Beklenen çıktı: HTTP/1.1 301 Moved Permanently
# Location: http://example.com/hakkimizda

Güvenlik Hususları

mod_speling kullanırken bazı güvenlik noktalarına dikkat etmek gerekir.

Dizin Listeleme ile Etkileşim

mod_speling dizin içeriğini taramak zorunda olduğundan, Options Indexes aktifse hassas bilgiler açığa çıkabilir. Dizin listelemeyi kapalı tutun:

<Directory /var/www/example>
    Options -Indexes +FollowSymLinks
    <IfModule mod_speling.c>
        CheckSpelling On
    </IfModule>
    AllowOverride All
    Require all granted
</Directory>

Hassas Dizinleri Koruma

Yönetim paneli veya API endpoint’leri gibi hassas dizinlerde mod_speling‘i devre dışı bırakın:

<Location /admin>
    <IfModule mod_speling.c>
        CheckSpelling Off
    </IfModule>
    Require ip 192.168.1.0/24
</Location>

<Location /api>
    <IfModule mod_speling.c>
        CheckSpelling Off
    </IfModule>
</Location>

SEO ve Yönlendirme Etkisi

mod_speling 301 yönlendirmesi yaptığından, arama motorları bu yönlendirmeleri kalıcı kabul eder. Bu genellikle istenen davranıştır, ancak geliştirme ortamında 302 geçici yönlendirmesi tercih edilebilir. Ne yazık ki mod_speling yönlendirme türünü doğrudan yapılandırmanıza izin vermiyor, bu yüzden geliştirme ortamlarında modülü tamamen kapatmanız daha sağlıklıdır.

Tam Yapılandırma Örneği

Tüm öğrenilenleri bir araya getiren, production ortamına hazır bir yapılandırma örneği:

<VirtualHost *:443>
    ServerName www.sirketim.com.tr
    ServerAlias sirketim.com.tr
    DocumentRoot /var/www/sirketim

    # SSL
    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/sirketim.com.tr/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/sirketim.com.tr/privkey.pem

    # mod_speling yapılandırması
    <IfModule mod_speling.c>
        CheckSpelling On
        CheckCaseOnly Off
    </IfModule>

    # Statik dosyalar için devre dışı
    <FilesMatch ".(jpg|jpeg|png|gif|webp|css|js|ico|pdf|zip)$">
        <IfModule mod_speling.c>
            CheckSpelling Off
        </IfModule>
    </FilesMatch>

    # Hassas alanlar için devre dışı
    <Location /wp-admin>
        <IfModule mod_speling.c>
            CheckSpelling Off
        </IfModule>
    </Location>

    <Location /api>
        <IfModule mod_speling.c>
            CheckSpelling Off
        </IfModule>
    </Location>

    # Dizin ayarları
    <Directory /var/www/sirketim>
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    # Özel hata sayfaları
    ErrorDocument 404 /404.html
    ErrorDocument 500 /500.html

    # Loglar
    LogLevel warn speling:info
    ErrorLog ${APACHE_LOG_DIR}/sirketim_error.log
    CustomLog ${APACHE_LOG_DIR}/sirketim_access.log combined
</VirtualHost>

Yapılandırmayı kaydetip test edin:

# Sözdizimi kontrolü
sudo apachectl configtest

# Servisi yeniden başlat
sudo systemctl reload apache2

Sonuç

mod_speling, sysadmin araç kutusunda sıklıkla göz ardı edilen ama doğru kullanıldığında ciddi değer katan bir modüldür. Özellikle içerik ağırlıklı kurumsal sitelerde, kullanıcıların URL hatalarından kaynaklanan 404 sayfalarını azaltmak için pratik ve düşük maliyetli bir çözüm sunar.

Ancak her araç gibi sınırlamaları vardır. Yüzlerce dosya içeren büyük dizinlerde performans etkisi göz önünde bulundurulmalı, hassas dizinler korunmalı ve modül production’a alınmadan önce mutlaka test ortamında doğrulanmalıdır. mod_rewrite ile birlikte kullanıldığında ise son derece güçlü bir URL yönetim altyapısı oluşturulabilir.

Sonuç olarak, küçük ama etkili bir yapılandırma değişikliği ile kullanıcı deneyimini iyileştirme ve 404 hatalarından kaynaklanan bounce rate’i düşürme fırsatı sunduğu için mod_speling‘i değerlendirmeye kesinlikle değer.

Bir yanıt yazın

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