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ı (
/Hakkimizdayerine/hakkimizdagibi) - 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.
