Apache’den OpenLiteSpeed’e geçiş yapan sistem yöneticilerinin en çok kafasının karıştığı konulardan biri rewrite kuralları. Yıllarca .htaccess dosyalarına mod_rewrite direktifleri yazıp durmuşsunuzdur, sonra bir gün OpenLiteSpeed’e geçiyorsunuz ve “bu kurallar neden çalışmıyor?” diye düşünmeye başlıyorsunuz. Aslında OLS’un rewrite motoru Apache mod_rewrite ile büyük ölçüde uyumlu, ama bazı kritik farklar var. Bu yazıda hem temel farkları hem de gerçek dünya senaryolarında karşılaşacağınız dönüşüm örneklerini ele alacağız.
OpenLiteSpeed Rewrite Motoru Nasıl Çalışır?
OpenLiteSpeed, Apache’nin mod_rewrite modülüne benzer bir rewrite motoru kullanır. Temel direktifler aynıdır: RewriteEngine, RewriteCond, RewriteRule. Ancak OLS bu kuralları işleme biçimi açısından birkaç önemli farklılık içerir.
Apache’de rewrite kuralları .htaccess dosyalarından ya da VirtualHost bloklarından okunur ve runtime’da işlenir. OLS’ta ise kurallar önce Web Admin Panel üzerinden ya da virtual host konfigürasyon dosyalarından okunur, derlenir ve belleğe alınır. Bu sayede performans açısından büyük avantaj sağlar.
OLS’ta rewrite kurallarını iki farklı yerden yönetebilirsiniz:
- Web Admin Panel (port 7080): Virtual Host > Rewrite bölümünden kuralları doğrudan girebilirsiniz
- Konfigürasyon dosyaları:
/usr/local/lsws/conf/vhosts//vhconf.confdosyasını doğrudan düzenleyebilirsiniz .htaccessdosyaları: Apache uyumluluğu için .htaccess desteği açık olduğunda çalışır
# OLS virtual host konfigürasyon dosyasının tipik konumu
ls -la /usr/local/lsws/conf/vhosts/
# veya OpenLiteSpeed'in varsayılan konumu
cat /usr/local/lsws/conf/vhosts/Example/vhconf.conf
Temel Rewrite Direktifleri ve Farklar
RewriteEngine ve RewriteBase
Apache’deki RewriteBase direktifi OLS’ta da desteklenir, ancak davranışı biraz farklıdır. OLS’ta RewriteBase özellikle .htaccess içinde kullanıldığında dikkatli olmanız gerekir.
# Apache'de çalışan standart konfigürasyon
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L,QSA]
Bu kural OLS’ta da aynen çalışır. WordPress, Laravel ve benzeri frameworklerin .htaccess dosyaları genellikle sorunsuz aktarılır.
Flags (Bayraklar) Farkları
Rewrite kurallarındaki bayraklar büyük önem taşır. OLS’ta desteklenen bayraklar:
- [L]: Last rule, zinciri durdur
- [R] veya [R=301]: Redirect, yönlendirme yap
- [QSA]: Query String Append, mevcut parametreleri koru
- [NC]: No Case, büyük/küçük harf duyarsız eşleştir
- [PT]: Pass Through, OLS’ta Apache’dekinden farklı davranabilir
- [F]: Forbidden, 403 döndür
- [G]: Gone, 410 döndür
- [E=VAR:VAL]: Environment variable set et
Önemli fark: Apache’deki [PT] (Pass Through) bayrağı OLS’ta tam olarak desteklenmez. Eğer [PT] kullanan kurallarınız varsa, bu kuralları OLS mimarisine uygun şekilde yeniden yazmanız gerekebilir.
# Apache'de çalışır ama OLS'ta sorun çıkarabilir
RewriteRule ^/api/(.*)$ /backend/$1 [PT,L]
# OLS'ta daha güvenli alternatif
RewriteRule ^/api/(.*)$ /backend/$1 [L]
Gerçek Dünya Senaryosu 1: WordPress Çoklu Site
WordPress çoklu site kurulumları, rewrite açısından en karmaşık senaryolardan biridir. Subdirectory tabanlı WordPress multisite için Apache’den OLS’a geçişte şu adımları izleyin.
Önce Apache’deki orijinal kural setine bakalım:
# Apache .htaccess - WordPress Multisite (Subdirectory)
RewriteEngine On
RewriteBase /
# WordPress multisite için network kuralları
RewriteRule ^index.php$ - [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*.php)$ $2 [L]
RewriteRule . index.php [L]
Bu kurallar OLS’ta .htaccess üzerinden doğrudan çalışmalıdır. Ancak OLS Web Admin Panel üzerinden tanımlamak istiyorsanız:
# OLS Admin Panel > Virtual Hosts > [VHost] > Rewrite Tab'a girecek kural seti
rewrite {
enable 1
autoLoadHtaccess 1
rules <<<END_rules
RewriteRule ^index.php$ - [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*.php)$ $2 [L]
RewriteRule . index.php [L]
END_rules
}
Gerçek Dünya Senaryosu 2: HTTPS Yönlendirme ve WWW Normalizasyonu
HTTP’den HTTPS’e ve www’suz versiyona yönlendirme, her sunucuda ihtiyaç duyulan temel bir kural setidir.
# Apache versiyonu
RewriteEngine On
# HTTP'den HTTPS'e zorla
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# www'lu versiyonu www'suza yönlendir
RewriteCond %{HTTP_HOST} ^www.(.+)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
OLS’ta bu kuralları kullanırken dikkat edilmesi gereken nokta, eğer OLS’un önünde bir reverse proxy (Nginx, CDN) varsa %{HTTPS} değişkeni her zaman doğru sonuç vermeyebilir. Bu durumda header kontrolü daha güvenilirdir:
# OLS'ta CDN veya proxy arkasındayken HTTPS kontrolü
RewriteEngine On
# X-Forwarded-Proto header kontrolü
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# www'yu non-www'ya yönlendir
RewriteCond %{HTTP_HOST} ^www.example.com$ [NC]
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]
Gerçek Dünya Senaryosu 3: Laravel ve Symfony Frameworkleri
Modern PHP frameworkleri için front controller pattern kullanan rewrite kuralları OLS’ta genellikle sorunsuz çalışır.
# Laravel için standart .htaccess (public/ dizini)
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews -Indexes
</IfModule>
RewriteEngine On
# Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
# Redirect Trailing Slashes
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [L,R=301]
# Send Requests To Front Controller
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>
Bu kural seti OLS’ta aynen çalışır. Ancak direktiflerini OLS Web Admin Panel üzerinden girerken bloklarını kaldırmanız gerekir:
# OLS Admin Panel için temizlenmiş Laravel kuralları
RewriteEngine On
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [L,R=301]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
mod_rewrite’tan OLS’a Dönüşümde Sorun Yaşanan Durumlar
Direktifleri
OLS, bloklarını .htaccess dosyalarında okurken genellikle bu bloğun içeriğini işler. Ancak Web Admin Panel üzerinden kural girerken bu blokları kaldırmanız şarttır.
Options Direktifi
Apache’de sıkça kullanılan Options -Indexes veya Options FollowSymLinks gibi direktifler OLS’ta rewrite kuralları ile birlikte .htaccess‘te çalışmaz. Bu ayarları OLS’un Web Admin Panel > Virtual Host > General bölümünden yapmanız gerekir.
# OLS'ta dizin listesini kapatmak için doğru yol
# Admin Panel > VirtualHosts > [VHost] > General > Index Files
# ya da vhconf.conf dosyasında:
indexFiles index.html, index.php
autoIndex 0
Backreference Kullanımı
Apache mod_rewrite’ta $1, $2 kullanırken OLS’ta da aynı syntax geçerlidir. Ancak %1, %2 (RewriteCond backreference) kullanımında dikkatli olun:
# Apache ve OLS'ta çalışan doğru kullanım
RewriteCond %{HTTP_HOST} ^(www.)?(.+)$
RewriteRule ^ https://%2%{REQUEST_URI} [R=301,L]
# %1 VE %2 aynı RewriteCond'dan gelen backreference'lar
# $1, $2 ise RewriteRule pattern'ından gelenler
RewriteRule ^/eski-sayfa/(.+)/(.+)$ /yeni-sayfa/$2/$1 [R=301,L]
Performans Odaklı OLS Rewrite Stratejileri
OLS’un en büyük avantajlarından biri, kuralları statik dosya isteklerinde bypass edebilmesidir. Bu özelliği doğru kullanmak sunucu yükünü ciddi ölçüde azaltır.
# Statik dosyalar için rewrite işlemini erken sonlandır
RewriteEngine On
# Statik dosyaları rewrite'tan muaf tut
RewriteCond %{REQUEST_URI} .(jpg|jpeg|png|gif|webp|svg|ico|css|js|woff|woff2|ttf|eot)$
RewriteRule ^ - [L]
# Cache-busting pattern'i için temizle
# /assets/style.abc123.css -> /assets/style.css
RewriteRule ^(.+).[a-f0-9]{8}.(css|js)$ $1.$2 [L]
# Ana uygulama yönlendirmesi
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?route=$1 [L,QSA]
OLS Cache ile Entegrasyon
OLS’ta LiteSpeed Cache eklentisi kullanıyorsanız, rewrite kurallarının cache bypass mekanizmasıyla çakışmamasına dikkat etmelisiniz:
# LiteSpeed Cache ile uyumlu rewrite yapısı
RewriteEngine On
# Cache kontrolü için cookie bazlı bypass
RewriteCond %{HTTP_COOKIE} wordpress_logged_in [NC]
RewriteRule ^ - [L]
# Normal rewrite akışı
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L,QSA]
OLS’ta Rewrite Kurallarını Test Etme ve Debug Etme
Rewrite kurallarınızın doğru çalışıp çalışmadığını test etmek için birkaç yöntem kullanabilirsiniz.
# OLS error log'unu gerçek zamanlı izle
tail -f /usr/local/lsws/logs/error.log
# Belirli bir virtual host'un log'unu izle
tail -f /usr/local/lsws/logs/example.com.log
# OLS'u graceful restart ile konfigürasyonu yenile
/usr/local/lsws/bin/lswsctrl restart
# Konfigürasyon syntax kontrolü (OLS için)
/usr/local/lsws/bin/lswsctrl status
OLS Admin Panel üzerinden rewrite debug modunu açmak için:
- Admin Panel > Virtual Hosts > [VHost] > Rewrite sekmesine gidin
- Log Level değerini
0‘dan9‘a çıkarın (9 en ayrıntılı log) - Sonrasında
/usr/local/lsws/logs/altındaki log dosyalarını inceleyin
# Rewrite log seviyesini değiştirdikten sonra OLS'u yenile
/usr/local/lsws/bin/lswsctrl restart
# Rewrite ile ilgili log satırlarını filtrele
grep -i "rewrite" /usr/local/lsws/logs/error.log | tail -50
# Belirli bir URL için test et
curl -I -L http://example.com/test-url
curl -I -L --verbose http://example.com/eski-sayfa 2>&1 | grep -E "Location|HTTP/"
Karmaşık Senaryo: E-Ticaret URL Yapısı
Gerçek bir e-ticaret sitesinde hem SEO dostu URL’ler hem de eski URL’lerden yönlendirme hem de farklı dil yapısı yönetmek zorunda kalabilirsiniz.
# E-ticaret sitesi için kapsamlı OLS rewrite kuralları
RewriteEngine On
RewriteBase /
# Eski URL formatından yeni formata yönlendir
# /urun.php?id=123 -> /urunler/urun-slug-123
RewriteCond %{QUERY_STRING} ^id=([0-9]+)$
RewriteRule ^urun.php$ /urunler/urun-%1? [R=301,L]
# Dil prefix yönetimi (tr, en, de)
RewriteCond %{REQUEST_URI} !^/(tr|en|de)/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /tr/$1 [R=301,L]
# Kategori sayfaları
RewriteRule ^(tr|en|de)/kategori/([a-z0-9-]+)/?$ index.php?lang=$1&cat=$2 [L,QSA]
# Ürün sayfaları
RewriteRule ^(tr|en|de)/urun/([a-z0-9-]+)-([0-9]+)/?$ index.php?lang=$1&product=$2&id=$3 [L,QSA]
# Genel fallback
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L,QSA]
.htaccess Dosyalarını Otomatik Taşıma Stratejisi
Birden fazla site taşıyorsanız, .htaccess dosyalarını manuel kontrol etmek yerine sistematik bir yaklaşım benimseyebilirsiniz.
# Tüm .htaccess dosyalarını bul ve içeriklerini listele
find /var/www -name ".htaccess" -type f | while read f; do
echo "=== $f ==="
cat "$f"
echo ""
done
# OLS ile uyumsuz olabilecek direktifleri tara
find /var/www -name ".htaccess" -exec grep -l "IfModule|Options|AddHandler|SetHandler" {} ;
# PHP handler ile ilgili satırları bul (OLS'ta farklı yapılandırılmalı)
grep -r "php_value|php_flag|AddHandler php" /var/www --include=".htaccess"
OLS’ta PHP ayarlarını .htaccess üzerinden php_value ile yapamazsınız. Bu değerleri Admin Panel > External App veya Virtual Host > General > PHP ini Override bölümünden yapmanız gerekir.
# OLS'ta PHP ayarlarını virtual host seviyesinde yönetmek için
# /usr/local/lsws/conf/vhosts/example.com/vhconf.conf dosyasına ekle
phpIniOverride {
php_value upload_max_filesize 64M
php_value post_max_size 64M
php_value memory_limit 256M
php_value max_execution_time 300
}
Sık Yapılan Hatalar ve Çözümleri
Trailing slash sorunları: OLS’ta trailing slash yönetimi Apache’den biraz farklı davranabilir. Kural yazarken hem slash’lı hem slash’sız versiyonu kapsayan kurallar yazmak daha güvenlidir.
Çift encoding: %{REQUEST_URI} kullanırken URL encoding konusunda dikkatli olun. OLS bazı durumlarda Apache’den farklı decode davranışı sergileyebilir.
RewriteLog seviyesi: Apache’deki RewriteLog direktifi OLS’ta kullanılmaz. Debug için Admin Panel üzerinden log seviyesini artırmanız gerekir.
Context sorunu: Apache’de VirtualHost bloğu içindeki kurallar ile .htaccess içindeki kurallar farklı context’te çalışır. OLS’ta da bu ayrım geçerlidir ve Virtual Host seviyesindeki kurallar .htaccess kurallarından önce işlenir.
Sonuç
OpenLiteSpeed’e geçiş yaparken rewrite kuralları konusunda paniklemek gerekmiyor. Büyük çoğunluk zaten Apache uyumlu çalışır. Dikkat edilmesi gereken temel noktalar şunlardır: bloklarını Admin Panel’den girerken kaldırmak, [PT] bayrağını dikkatli kullanmak, Options direktiflerini panel üzerinden yönetmek ve PHP ayarları için .htaccess yerine panel arayüzünü tercih etmek.
OLS’un rewrite performansı Apache’ye kıyasla belirgin biçimde daha iyidir çünkü kurallar çalışma zamanında parse edilmez, önceden derlenir. Özellikle yüksek trafikli sitelerde bu fark ölçülebilir bir şekilde ortaya çıkar. Geçiş sürecinde her zaman staging ortamında test edin, log seviyesini yüksek tutun ve sorunlu kuralları curl ile adım adım doğrulayın. Bir kez doğru yapılandırdıktan sonra OLS’un rewrite motorunun ne kadar hızlı ve kararlı çalıştığını görünce Apache’ye geri dönmek istemeyeceksiniz.