.htaccess Kullanımı: Yönlendirme, Önbellek ve Güvenlik Kuralları
.htaccess kullanımı, Apache ve LiteSpeed web sunucularında ana yapılandırmaya erişmeden, dosyanın bulunduğu klasör ve alt klasörleri için kural tanımlamak demektir. Yönlendirme, tarayıcı önbelleği, sıkıştırma, erişim kısıtlama ve özel hata sayfaları tek bir düz metin dosyasıyla yönetilir; kaydettiğiniz kural bir sonraki istekte geçerli olur.
Paylaşımlı hostingde sunucunun ana ayar dosyalarına dokunamadığınız için .htaccess sizin yapılandırma alanınızdır. LIONFIN web hosting hesaplarında dosya sitenin belge kökünde bulunur: cPanel’de public_html, Plesk’te httpdocs klasörü. Örnekleri kopyalamadan önce güvenli düzenleme bölümünü okuyun; bu dosyadaki bir yazım hatası, sitenin hiçbir sayfasının açılmamasına yol açar.
Kısa cevap
.htaccess kullanımı, Apache ve LiteSpeed sunucularda klasör bazında ayar yapmanın yoludur: dosyaya yazılan yönergeler o klasörü ve alt klasörlerini etkiler. 301 yönlendirme, HTTPS zorlama, tarayıcı önbelleği ve sıkıştırma, IP engelleme, dosya koruma ve özel hata sayfaları için kullanılır. Nginx bu dosyayı okumaz. Düzenlemeden önce yedek alın; hatalı tek bir satır sitenin tamamında 500 hatasına yol açar.
.htaccess nedir, hangi sunucularda çalışır?
.htaccess (hypertext access), Apache HTTP Server’ın dağıtık yapılandırma dosyasıdır: sunucu her istekte, istenen dosyanın yolundaki klasörlerde bu dosyayı arar ve içindeki yönergeleri uygular. Dosyanın adı tam olarak .htaccess olmalıdır; başındaki nokta onu Linux’ta gizli dosya yapar ve uzantısı yoktur.
| Web sunucusu | .htaccess desteği |
|---|---|
| Apache | Evet; hangi yönergelere izin verildiğini sunucu yöneticisi belirler (AllowOverride) |
| LiteSpeed Enterprise | Evet; Apache ile uyumlu biçimde okur |
| OpenLiteSpeed | Yalnızca yönlendirme (rewrite) kuralları |
| Nginx | Hayır; kurallar sunucu yapılandırmasına yazılır |
| Plesk’te PHP’yi doğrudan nginx’in sunduğu mod | Uygulanmaz; kurallar ek nginx yönergelerine taşınır |
Bir klasördeki dosya o klasörü ve altındaki tüm klasörleri etkiler. public_html içinde belge kökü bulunan ek alan adları ve subdomainler de üstteki kuralları devralabilir; bu yüzden yönlendirme kurallarında alan adını açıkça yazmak sürprizleri önler. Nginx kullanan bir VPS sunucuda aynı kurallar sunucu bloğuna çevrilir.
Güvenli .htaccess kullanımı: yedek, düzenleme ve test
Güvenli .htaccess kullanımı, her değişiklikten önce yedek almak ve kaydettikten hemen sonra test etmek demektir:
- Dosyayı görünür yapın. cPanel File Manager içinde Settings → Show Hidden Files seçeneğini açın; Plesk’te aynı dosyayı File Manager ile düzenleyebilirsiniz.
- Yedek alın. Dosyayı
.htaccess.yedekadıyla kopyalayın. - Kuralı doğru yere yazın. Özel kurallarınızı
# BEGIN WordPressbloğunun üstüne ekleyin.# BEGINve# ENDişaretleri arasındaki bloklar (WordPress, LiteSpeed Cache ya da cPanel’in PHP sürümü ve PHP ayarı blokları) ilgili araç tarafından yeniden yazılır; içlerini elle düzenlemeyin. - Kaydedip hemen test edin. Ana sayfayı, bir iç sayfayı ve yönetici panelini gizli pencerede açın; yönlendirmeleri
curl -Ikomutuyla kontrol edin. - Hata varsa geri dönün. 500 alırsanız yedeği geri yükleyin ve Metrics → Errors ekranında hatalı satırı okuyun.
Dosyayı bilgisayarınızda hazırlıyorsanız UTF-8 olarak ve BOM işareti olmadan kaydedin; dosyanın başındaki görünmez BOM karakteri de geçersiz komut hatasına yol açar. Dosya yöneticisinin diğer işlevleri cPanel dosya yöneticisi rehberindedir. Dosyada sizin eklemediğiniz, ziyaretçileri başka sitelere gönderen kurallar görürseniz site ele geçirilmiş olabilir; web sitesi hacklendi rehberindeki müdahale adımlarını izleyin.
Yönlendirme kuralları: 301, HTTPS ve www
Yönlendirmeler mod_rewrite modülünün RewriteCond ve RewriteRule satırlarıyla yazılır; örneklerde siteniz.com yerine kendi alan adınızı kullanın:
RewriteEngine On
# 1) www adresini çıplak alan adına topla (hedef doğrudan HTTPS)
RewriteCond %{HTTP_HOST} ^www\.siteniz\.com$ [NC]
RewriteRule ^ https://siteniz.com%{REQUEST_URI} [L,R=301]
# 2) Kalan HTTP isteklerini HTTPS adresine yönlendir
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# 3) Tek sayfayı kalıcı olarak taşı
RewriteRule ^eski-sayfa\.html$ /yeni-sayfa/ [L,R=301]www kuralını HTTPS kuralının üstüne yazdığınızda www’lu ya da şifresiz gelen her istek tek yönlendirmeyle son adrese ulaşır. www’lu adresi ana adres yapmak istiyorsanız ilk kuralda koşula www’suz alan adını, hedefe www’lu adresi yazmanız yeterlidir. Basit sayfa taşımaları için Redirect 301 /eski-sayfa.html /yeni-sayfa/ satırı da yeterlidir; ancak dosyada RewriteRule kuralları varsa sayfa yönlendirmelerini de aynı modülle yazmak çakışmaları önler. Site bir CDN ya da proxy arkasındaysa %{HTTPS} değişkeni sürekli off görünüp döngü oluşturabilir; bu durum ve Nginx/IIS karşılıkları HTTP HTTPS yönlendirme rehberinde, panelden yönlendirme ise cPanel yönlendirme ayarları rehberinde anlatılır.
Özel hata sayfaları ve dizin listeleme nasıl ayarlanır?
ErrorDocument yönergesi sunucunun standart hata sayfası yerine sizin hazırladığınız sayfayı gösterir; Options -Indexes ise index dosyası olmayan klasörlerin içeriğinin listelenmesini engeller:
ErrorDocument 404 /hata/404.html
ErrorDocument 403 /hata/403.html
ErrorDocument 500 /hata/500.html
Options -IndexesYol belge köküne göre yazılır ve sayfa gerçekten var olmalıdır. Hata sayfalarını mümkünse düz HTML olarak hazırlayın: 500 hatası PHP’den kaynaklanıyorsa PHP ile üretilen bir hata sayfası da açılmaz. WordPress 404 sayfasını kendisi ürettiği için orada ErrorDocument 404 satırına genellikle gerek yoktur. Dizin listeleme kapatıldığında index dosyası olmayan klasörler 403 döner; bu beklenen davranıştır ve nedenleri 403 Forbidden hatası rehberinde açıklanır. Bazı sunucular Options yönergesine izin vermez ve satır 500 hatası üretir; bu durumda satırı kaldırıp destek ekibine danışın.
Tarayıcı önbelleği ve sıkıştırma: mod_expires ve mod_deflate
Statik dosyaların tarayıcıda ne kadar saklanacağını mod_expires, metin tabanlı yanıtların sıkıştırılmasını mod_deflate belirler. <IfModule> blokları, modül sunucuda yüklü değilse satırların hata vermeden atlanmasını sağlar:
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/webp "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
ExpiresByType text/css "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
ExpiresByType text/html "access plus 0 seconds"
</IfModule>
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/css text/plain application/javascript application/json image/svg+xml
</IfModule>Uzun önbellek süresi, dosya adı ya da sürüm parametresi değişmedikçe ziyaretçinin eski CSS dosyasını görmesine yol açar; WordPress bunu ?ver= parametresiyle çözer. LiteSpeed sunucularda sıkıştırma çoğunlukla sunucu düzeyinde açıktır ve LiteSpeed Cache eklentisi kendi kurallarını ekler; ayrıntılar LiteSpeed Cache ayarları rehberinde. Sıkıştırmanın çalıştığını doğrulamak için:
curl -s -o /dev/null -D - -H "Accept-Encoding: gzip" https://siteniz.com/ | grep -i content-encoding
Erişim kısıtlama: IP engelleme ve dosya koruma
Apache 2.4’te erişim Require yönergeleriyle yönetilir. Belirli adresleri engellemek ve hassas dosyalara doğrudan erişimi kapatmak için:
# Belirli IP ve aralıkları engelle, geri kalanına izin ver
<RequireAll>
Require all granted
Require not ip 203.0.113.45
Require not ip 198.51.100.0/24
</RequireAll>
# wp-config.php dosyasına web üzerinden erişimi kapat
<Files wp-config.php>
Require all denied
</Files>
# Yedek, günlük ve ortam dosyalarını, PHP error_log dosyasını gizle
<FilesMatch "(\.(sql|bak|log|env)|^error_log)$">
Require all denied
</FilesMatch>Yalnızca ofisten erişilecek bir klasör için o klasöre ayrı bir .htaccess koyup içine Require ip 203.0.113.45 yazmanız yeterlidir. WordPress’te bu yöntemi wp-admin klasörüne uygularsanız ön yüzün kullandığı admin-ajax.php dosyasını istisna tutun. Eski Apache 2.2 biçimindeki Order, Allow ve Deny satırlarını Require satırlarıyla aynı blokta karıştırmayın; iki sözdizimi birlikte beklenmedik sonuç verir. Bu kurallar saldırı yüzeyini küçültür ama tek başına koruma değildir; diğer önlemler WordPress güvenliği yazısındadır.
PHP ayarları .htaccess ile değiştirilir mi?
Yalnızca PHP, Apache modülü (mod_php) olarak ya da LiteSpeed’in LSAPI arayüzüyle çalışıyorsa: php_value ve php_flag satırları ancak bu iki ortamda okunur. PHP-FPM, FastCGI ya da suPHP kullanan sunucularda aynı satırlar “Invalid command” hatasıyla 500 verir; bu ortamlarda ayarlar .user.ini dosyasına yazılır:
| PHP çalışma biçimi | .htaccess’te php_value | Önerilen yöntem |
|---|---|---|
| mod_php | Çalışır | Panel ya da .htaccess |
| LiteSpeed LSAPI | Çalışır | Panel ya da .htaccess |
| PHP-FPM, FastCGI, CGI | 500 hatası | Panel ya da .user.ini |
# .htaccess (mod_php ya da LSAPI)
php_value upload_max_filesize 64M
; .user.ini (PHP-FPM ya da FastCGI)
upload_max_filesize = 64MEn güvenli yol paneldir: cPanel’in MultiPHP INI Editor aracı ayarları .user.ini dosyasına ve IfModule ile korunan bir .htaccess bloğuna birlikte yazar; çalışma biçimi değişse de site bozulmaz. Bellek sınırına özel adımlar PHP memory limit artırma rehberindedir.
Sık Sorulan Sorular
.htaccess ile bir klasörde PHP çalıştırmayı nasıl engellerim?
Görsel yükleme klasörü gibi yalnızca statik dosya barındıran bir klasöre ayrı bir .htaccess koyun ve içine, .php uzantılı dosyaları FilesMatch ile seçip Require all denied ile kapatan bir blok yazın. Saldırgan oraya bir betik yüklese bile web üzerinden çalıştıramaz. WordPress’te bu yöntem wp-content/uploads klasörü için yaygındır; önce eklentilerinizin o klasörde PHP dosyası kullanmadığından emin olun.
Nginx sunucuda .htaccess çalışır mı?
Hayır. Nginx klasör bazlı yapılandırma dosyalarını okumaz; yönlendirme, önbellek ve erişim kuralları sunucu bloğuna yazılır ve yapılandırma yeniden yüklendiğinde geçerli olur. VPS üzerinde Nginx kullanıyorsanız .htaccess kurallarını Nginx yönergelerine çevirmeniz gerekir. Apache ve LiteSpeed Enterprise ise dosyayı istek sırasında okur.
LiteSpeed sunucuda .htaccess kuralları değişiklik gerektirir mi?
Çoğunlukla gerektirmez. LiteSpeed Enterprise, Apache’nin .htaccess sözdizimini okuduğu için yönlendirme, erişim ve önbellek kuralları olduğu gibi çalışır ve kaydettiğiniz değişiklik sunucuyu yeniden başlatmadan uygulanır. LiteSpeed’e özgü önbellek yönergeleri de aynı dosyada bulunabilir; LiteSpeed Cache eklentisi bunları kendi işaretli bloğunda yönetir. OpenLiteSpeed ise yalnızca yönlendirme kurallarını uygular.
Birden fazla .htaccess dosyası olursa hangisi geçerli olur?
Hepsi geçerlidir; sunucu istenen dosyanın yolundaki her klasörün .htaccess dosyasını sırayla uygular ve alt klasördeki yönergeler üsttekileri ezebilir. Yönlendirme kuralları ise alt klasörde kendi RewriteRule satırları varsa üst klasördekileri varsayılan olarak devralmaz. Beklenmedik bir davranışta yoldaki tüm .htaccess dosyalarını kontrol edin.
.htaccess ile klasöre şifre koyulur mu?
Evet; AuthType Basic, AuthUserFile ve Require valid-user yönergeleriyle bir klasörü kullanıcı adı ve şifreyle koruyabilirsiniz. Şifre dosyası belge kökü dışında tutulmalıdır. cPanel’deki Directory Privacy aracı aynı kuralları sizin yerinize yazar ve şifre dosyasını güvenli konumda oluşturur; elle yazmaktan daha az hata riski taşır.
Bu makale yardımcı oldu mu?
Geri bildiriminiz için teşekkürler!
kişi faydalı buldu