
cPanel .htaccess: 301 Yönlendirme ve Güvenlik Kuralları
cPanel LiteSpeed ortamında .htaccess ile 301 yönlendirme, www→non-www, HTTP→HTTPS, hotlink koruması, IP whitelist/blacklist, güvenlik header'ları (HSTS, CSP, X-Frame-Options), gzip ve tarayıcı önbelleği kurulum rehberi.
cPanel .htaccess Rehberi: 301 Yönlendirme, Güvenlik Kuralları ve Performans (2026)
WordPress'i HTTPS'e zorlamak istiyorsunuz ama birkaç satır yapıştırdınız, site beyaz ekran verdi. Ya da www → non-www yönlendirmesi yaptınız ama Analytics'te "duplicate content" uyarısı görünüyor. .htaccess bu kadar güçlü — ve aynı zamanda bu kadar kırılgan. Bu rehberde Buyukweb cPanel paketlerindeki Apache 2.4 + LiteSpeed ortamına özel .htaccess kullanımını, sık yapılan hataları ve güvenlik sıkılaştırma kurallarını aktaracağım.
Buyukweb perspektifi: cPanel hosting paketlerimizde web sunucusu olarak LiteSpeed 6.x çalışır. LiteSpeed, Apache 2.4 uyumlu .htaccess direktiflerini doğrudan yorumlar — mod_rewrite, mod_headers, mod_expires, mod_deflate gibi modüller eksiksiz desteklenir. Değişikliği kaydettiğiniz an LiteSpeed hot-reload ile kuralları yeniden okur; Apache restart gerekmez, etki anında gerçekleşir.
.htaccess Nedir — Ne Değildir
.htaccess (HyperText Access), Apache ve LiteSpeed'in dizin bazında yapılandırma dosyasıdır. Nokta ile başlaması dosyayı "gizli" yapar; Unix/Linux sistemlerde gizli dosyalar varsayılan olarak listelenmez.
Ne yapabilir:
- Belirli bir dizinde URL yönlendirme ve rewrite kuralları
- HTTP header ekleme/kaldırma (güvenlik, önbellekleme)
- Dosya/dizin erişim kontrolü
- Özel hata sayfaları
- MIME tipi tanımlama
- Gzip sıkıştırma ve önbellekleme
Ne yapamaz / ne zaman tercih etmemelisiniz:
.htaccess kuralları her HTTP isteğinde sunucu tarafından dosya sistemi üzerinde tekrar okunur. Yüksek trafikli bir sitede (saniyede 100+ istek) bu I/O maliyeti birikerek performans kaybına dönüşür. Eğer WHM erişiminiz varsa (Buyukweb Reseller paketleri), yüksek trafik kurallarını vhost include dosyasına taşımak belirgin fark yaratır. Buyukweb cPanel paketlerinde müşteri-bazlı vhost include desteği yoktur; bu nedenle cPanel shared hosting kullanıcıları için .htaccess tek seçenektir ve LiteSpeed'in bunu Apache'ye kıyasla daha verimli işlemesi pratikte bu maliyeti büyük ölçüde dengeler.
.htaccess Dosyasına Erişim
cPanel File Manager ile (Önerilen Yol)
cPanel > Dosya Yöneticisi > public_html
→ Araç çubuğu > Ayarlar > "Gizli Dosyaları Göster" ✓
→ .htaccess sağ tık > Düzenle
Düzenlemeden önce: Sağ tık > Kopyala ile .htaccess-yedek adıyla aynı dizine bir kopya alın. Tek satır hata tüm siteyi 500 Internal Server Error'a düşürür; geri dönüş yolunuzun hazır olması gerekir.
FTP / SFTP ile
FTP istemcinizde (FileZilla) "Gizli dosyaları zorla göster" seçeneğini aktif edin: Sunucu > Gizli dosyaları zorla göster. Buyukweb cPanel paketlerinde SFTP port 22'den aktiftir; şifresiz FTP yerine SFTP tercih edin.
Temel .htaccess Yapısı
# Yorum satırı başına # ile
# Boş satır kural grupları arasında okunabilirlik sağlar
# Rewrite motoru — büyük çoğunlukla açık tutulur
RewriteEngine On
# Direktifler buraya eklenir
mod_rewrite kullanıyorsanız dosyanın en üstüne RewriteEngine On yazılması zorunludur; aksi hâlde tüm RewriteCond ve RewriteRule satırları sessizce yok sayılır.
301 Yönlendirme — Kalıcı SEO-Dostu Redirect
Tek Sayfa Yönlendirme
Eski URL'den yeni URL'ye kalıcı yönlendirme:
# Eski blog yazısı → yeni slug
Redirect 301 /eski-sayfa.html https://siteniz.com/yeni-sayfa/
# Birden fazla yönlendirme
Redirect 301 /hakkimizda.html https://siteniz.com/hakkimizda/
Redirect 301 /iletisim.html https://siteniz.com/iletisim/
Redirect 301 /urunler.html https://siteniz.com/urunler/
Neden 301 ve 302 arasındaki fark önemli: 301 "kalıcı taşındı" sinyali; arama motoru botu bağlantı güvenini (link equity) yeni URL'ye aktarır. 302 "geçici" demektir, link equity aktarılmaz. Bir sayfayı kalıcı olarak taşıyorsanız her zaman 301 kullanın.
mod_rewrite ile Koşullu Yönlendirme
RewriteEngine On
# www → non-www (canonical non-www tercih)
RewriteCond %{HTTP_HOST} ^www.(.+)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
# non-www → www (canonical www tercih)
RewriteCond %{HTTP_HOST} !^www. [NC]
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]
İkisini aynı anda kullanmayın — karşılıklı döngü (redirect loop) oluşturur ve tarayıcı "ERR_TOO_MANY_REDIRECTS" hatası verir.
HTTP → HTTPS Zorlama
Buyukweb cPanel paketlerinde AutoSSL varsayılan olarak aktif; SSL sertifikanız zaten mevcut. HTTP trafiğini HTTPS'e yönlendirmek için:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
LiteSpeed ortamında bazen %{HTTPS} değişkeni doğru dönmez; alternatif kontrol:
RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Eski Domain'den Yeni Domain'e Tam Yönlendirme
Domain değiştirdiniz; eski domain tüm trafiği yenisine aktaracak:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^(www.)?eskidomain.com$ [NC]
RewriteRule ^(.*)$ https://yenidomain.com/$1 [R=301,L]
Bakım Modu (Geçici 302)
Site bakımdayken ziyaretçileri bilgilendirme sayfasına yönlendir; kendi IP adresinizi muaf tut:
RewriteEngine On
RewriteCond %{REQUEST_URI} !/bakim.html$
RewriteCond %{REMOTE_ADDR} !^123.456.789.000$
RewriteRule ^(.*)$ /bakim.html [R=302,L]
302 kullanın — kalıcı kapatma değil, geçici bakım. Google bot bunu "geçici" olarak işler, index'i etkilemez.
Güvenlik Kuralları
IP Whitelist / Blacklist
Apache 2.4 sözdizimi (eski Apache 2.2'nin Order Allow,Deny sözdizimi cPanel'de hâlâ çalışabilir; ama 2.4 sözdizimi tercih edilmelidir):
# Belirli IP'yi engelle (Apache 2.4)
<RequireAll>
Require all granted
Require not ip 192.168.1.100
Require not ip 10.20.30.0/24
</RequireAll>
# Sadece belirlediğiniz IP'lere izin ver — geri kalanı engelle
<RequireAny>
Require ip 123.456.789.000
Require ip 111.222.333.0/24
</RequireAny>
wp-login.php İçin IP Kısıtlama
WordPress giriş sayfasını sadece kendi IP adresinizden erişilebilir yapın:
<Files wp-login.php>
Order Deny,Allow
Deny from all
Allow from 123.456.789.000
</Files>
Dinamik IP kullanıyorsanız bu yaklaşım sorun çıkarır — kendinizi kilitleyebilirsiniz. Alternatif: Cloudflare Access ile zero-trust giriş, ya da Buyukweb 7/24 destek hattı üzerinden (0850 302 60 70) geçici IP whitelist için destek alabilirsiniz.
wp-config.php ve .htaccess'i Koruma
# wp-config.php doğrudan web erişimini engelle
<Files wp-config.php>
Require all denied
</Files>
# .htaccess dosyasının kendisine web'den erişimi engelle
<Files .htaccess>
Require all denied
</Files>
# xmlrpc.php — kullanmıyorsanız kapat
<Files xmlrpc.php>
Require all denied
</Files>
Dizin Listelemeyi Kapat
Options -Indexes
Bu satır olmadan /uploads/ gibi index.html içermeyen klasöre istek geldiğinde sunucu içerik listesini gösterir — veri ifşasına açık kapı. Buyukweb cPanel paketlerinde sunucu seviyesinde kapatılmıştır; ama .htaccess'te de belirtmek ek güvence sağlar.
Hotlink Koruması (Bant Genişliği Hırsızlığı)
Başka sitelerin görsellerinizi kendi sayfalarında doğrudan göstermesini, videolarınızı embed etmesini engelleyin:
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https?://(www.)?siteniz.com [NC]
RewriteRule .(jpg|jpeg|png|gif|webp|svg|mp4|pdf|zip)$ - [F,NC]
Arama motorlarının önizleme için görsel çekmesine izin vermek istiyorsanız Google bot'unu muaf tutun:
RewriteCond %{HTTP_REFERER} !^https?://(www.)?google. [NC]
RewriteCond %{HTTP_REFERER} !^https?://(www.)?siteniz.com [NC]
Kötü Niyetli User-Agent Engelleme
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} (Scrapy|python-requests|libwww-perl|masscan|zgrab) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^$ [NC]
RewriteRule .* - [F,L]
Boş user-agent (^$) bloklamasına dikkat: bazı meşru monitoring araçları boş UA gönderebilir. Kendi monitoring IP'nizi önceki bir RewriteCond'da beyaz listeye alın.
Güvenlik HTTP Header'ları
<IfModule mod_headers.c>
# Clickjacking önleme
Header always set X-Frame-Options "SAMEORIGIN"
# MIME sniffing önleme
Header always set X-Content-Type-Options "nosniff"
# XSS koruması (modern tarayıcılarda CSP daha etkili)
Header always set X-XSS-Protection "1; mode=block"
# HSTS — HTTPS zorlama (bir kez gönderilince 1 yıl cache)
# DİKKAT: Siteye HTTP ile hiç ulaşılmamalı; SSL sertifika sorununda siteden edemezsiniz
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
# Referrer Policy
Header always set Referrer-Policy "strict-origin-when-cross-origin"
# Content Security Policy (sitenize göre özelleştirin)
Header always set Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:;"
</IfModule>
HSTS uyarısı: Strict-Transport-Security header'ı tarayıcı cache'e 1 yıl yazılır. SSL sertifikanız biterse veya HTTP'ye geçmeniz gerekirse ziyaretçi tarayıcıları bu süre boyunca HTTP'ye geçemez. İlk denemede max-age=300 (5 dakika) ile test edin, sorun yoksa 31536000'e çıkarın.
Özel Hata Sayfaları
ErrorDocument 400 /hatalar/400.html
ErrorDocument 401 /hatalar/401.html
ErrorDocument 403 /hatalar/403.html
ErrorDocument 404 /hatalar/404.html
ErrorDocument 500 /hatalar/500.html
404 sayfasını özelleştirmek hem kullanıcı deneyimi hem SEO açısından önemli; ziyaretçiyi siteden kaçırmak yerine ana sayfaya veya arama alanına yönlendirin.
Performans: Tarayıcı Önbellekleme ve Gzip
Tarayıcı Önbellekleme (mod_expires)
Statik dosyalar için tarayıcıya "bunu X süre boyunca cache'le" talimatı:
<IfModule mod_expires.c>
ExpiresActive On
# Görseller — değişmez içerik, uzun süre
ExpiresByType image/jpg "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
ExpiresByType image/gif "access plus 1 year"
ExpiresByType image/webp "access plus 1 year"
ExpiresByType image/svg+xml "access plus 1 year"
ExpiresByType image/x-icon "access plus 1 year"
# CSS ve JavaScript — sık güncellenebilir
ExpiresByType text/css "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
ExpiresByType text/javascript "access plus 1 month"
# Fontlar
ExpiresByType font/woff2 "access plus 1 year"
ExpiresByType application/font-woff "access plus 1 year"
# HTML — kısa tutun, yoksa güncel içerik görünmez
ExpiresByType text/html "access plus 1 hour"
</IfModule>
Cache-Control header'ı da eklemek istiyorsanız (mod_headers ile):
<IfModule mod_headers.c>
<FilesMatch ".(jpg|jpeg|png|gif|webp|ico|css|js|woff2)$">
Header set Cache-Control "public, max-age=2592000"
</FilesMatch>
</IfModule>
Gzip Sıkıştırma (mod_deflate)
Metin tabanlı içerikleri HTTP düzeyinde sıkıştırın; ortalama %60-80 boyut azalması:
<IfModule mod_deflate.c>
# Sıkıştırılacak MIME tipleri
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/json
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE image/svg+xml
# Eski tarayıcı uyumluluk — IE6 gzip sorununu atla
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4.0[678] no-gzip
BrowserMatch MSI[E] !no-gzip !gzip-only-text/html
# Zaten sıkıştırılmış formatları tekrar sıkıştırma
SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png|webp|zip|gz|bz2|rar|7z)$ no-gzip dont-vary
</IfModule>
Not: LiteSpeed kendi cache motoru (LSCache) ile gzip ve Brotli sıkıştırmayı sunucu seviyesinde uygular. WordPress'teyseniz LiteSpeed Cache eklentisi bu ayarları .htaccess yerine otomatik olarak yönetir; mod_deflate ile çakışmayı önlemek için ikisini aynı anda kullanmayın.
WordPress için .htaccess
WordPress'in varsayılan .htaccess bloğu:
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
Bu bloğun arasına kural eklemeyin — WordPress güncellemesinde üzerine yazabilir. Özel kurallarınızı # BEGIN WordPress satırının üstüne veya # END WordPress satırının altına ekleyin.
wp-includes Dizini Doğrudan Erişim Engeli
# BEGIN WordPress bloğunun dışına, üstüne ekleyin
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^wp-admin/includes/ - [F,L]
RewriteRule ^wp-includes/[^/]+.php$ - [F,L]
RewriteRule ^wp-includes/js/tinymce/langs/.+.php - [F,L]
RewriteRule ^wp-includes/theme-compat/ - [F,L]
</IfModule>
.htaccess Hata Giderme
Dosyayı kaydettikten sonra 500 Internal Server Error alıyorsanız:
- Dosyayı yeniden adlandırın: cPanel File Manager'dan
.htaccess→.htaccess-bak. Site açılırsa sorun .htaccess'te. - Hata loguna bakın: cPanel > Logs > Error Log. Sözdizimi hatası olan satırı gösterir.
- Kuralları parça parça test edin: Tüm içeriği silerek sıfırdan her bloğu tek tek ekleyin.
Buyukweb cPanel paketlerinde hata loglarına cPanel > Logs > Error Log menüsünden erişebilirsiniz. Teknik destek için 0850 302 60 70'i arayın; destek ekibimiz .htaccess kurallarında yardımcı olur.
Yaygın sözdizimi hataları:
# YANLIŞ — [NC] bayrağından önce virgül gerekmez bu konumda
RewriteCond %{HTTP_HOST} ^www. NC
# DOĞRU
RewriteCond %{HTTP_HOST} ^www. [NC]
# YANLIŞ — RewriteRule'da flag parantezi kapatılmamış
RewriteRule ^(.*)$ https://siteniz.com/$1 [R=301,L
# DOĞRU
RewriteRule ^(.*)$ https://siteniz.com/$1 [R=301,L]
mod_rewrite Bayrakları (Flags) Özeti
| Bayrak | Açıklama |
|---|---|
[L] |
Last — bu kural eşleşirse daha fazla kural işleme |
[R=301] |
Redirect 301 yönlendirme |
[R=302] |
Redirect 302 geçici yönlendirme |
[F] |
Forbidden — 403 döndür |
[NC] |
NoCase — büyük/küçük harf duyarsız eşleme |
[QSA] |
QueryStringAppend — mevcut query string'i koru |
[NE] |
NoEscape — özel karakterleri escape etme |
[PT] |
PassThrough — sonraki handler'a geç |
[S=N] |
Skip N — sonraki N kuralı atla |
Sıkça Sorulan Sorular
Buyukweb cPanel'de .htaccess değişiklikleri anında mı etkiliyor?
Evet. LiteSpeed 6.x, .htaccess dosyasındaki değişikliği kaydeder kaydetmez hot-reload ile uygular. Apache'nin aksine servisi yeniden başlatmaya gerek yoktur; değişiklik milisaniyeler içinde aktif olur.
PHP 8.2 ile .htaccess kuralları arasında uyumsuzluk olur mu?
.htaccess kuralları web sunucusu (LiteSpeed/Apache) katmanında çalışır; PHP sürümünden bağımsızdır. Buyukweb cPanel paketlerinde Multi-PHP Manager ile PHP 5.2'den 8.4'e her sürüm seçilebilir; bu seçim .htaccess'i etkilemez.
www → non-www yönlendirmesini yaptım ama hâlâ "redirect loop" hatası alıyorum.
Olası nedenler: (1) LiteSpeed cache eskiyi sunuyor — tarayıcı cache temizleyin. (2) WordPress Genel Ayarlar'da "Site URL" ve "WordPress URL" biri www'li biri www'siz tanımlı — ikisini aynı yapın. (3) Cloudflare DNS proxy aktifse Cloudflare tarafında da aynı yönü zorlayan ayar var — çakışmayı önlemek için Cloudflare'de "Flexible SSL" yerine "Full" moduna geçin.
HSTS header'ı ekledim ama artık HTTP test sayfama giremiyorum.
HSTS browser'a kaydedildiği an max-age süresince HTTP'ye geçiş tarayıcı tarafından engellenir. Test etmek için: Chrome'da chrome://net-internals/#hsts → "Delete domain security policies" ile o domain'in HSTS kaydını silin. Üretim ortamına almadan önce kısa max-age değeriyle test edin.
.htaccess ile PHP memory_limit artırılabilir mi?
cPanel + CloudLinux CageFS ortamında kullanıcı başına kaynak sınırlaması (LVE) sunucu seviyesinde uygulanır. .htaccess'te php_value memory_limit 256M yazabilirsiniz ama CloudLinux LVE sınırı daha düşükse bu değer geçersiz kalır. Gerçek sınır artışı için paket yükseltmesi veya Buyukweb destek hattı üzerinden LVE ayarı gerekir.
mod_rewrite çalışmıyor, tüm URL'ler 404 veriyor.
İki şeyi kontrol edin: (1) .htaccess dosyası public_html kök dizininde mi? (2) RewriteEngine On satırı var mı? LiteSpeed'de genellikle bu iki adım yeterlidir; Apache'deki AllowOverride All direktifini ayrıca eklemenize gerek yoktur çünkü Buyukweb cPanel sunucularında bu varsayılan olarak açıktır.
Content Security Policy ekledim, site bozuldu.
CSP en sık "inline script/style" izinleri yüzünden bozulur. Tarayıcı konsolunda (F12 > Console) Content Security Policy blocked hatalarını inceleyin; hangi kaynak bloklandığını gösterir. 'unsafe-inline' geçici olarak ekleyip sonra nonce/hash tabanlı daha sıkı politikaya geçebilirsiniz. WordPress ve çoğu sayfa oluşturucu inline JS kullandığı için CSP uygulaması karmaşıklaşır; aşamalı geçiş yapın.
Hotlink koruması açıkken Google görsel araması görsellerimi göstermiyor.
Googlebot UA'sını veya boş referer'ı beyaz listeye almak bu sorunu çözer:
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https?://(www.)?siteniz.com [NC]
RewriteCond %{HTTP_REFERER} !^https?://(www.)?google. [NC]
RewriteRule .(jpg|jpeg|png|gif|webp)$ - [F,NC]
Sonuç
.htaccess esnekliği ve anında etkisi ile cPanel hosting'in en güçlü araçlarından biri. Buyukweb cPanel paketlerinde LiteSpeed 6.x altyapısı sayesinde değişiklikler hot-reload ile anında devreye girer; CloudLinux + Imunify360 sunucu güvenliği temel korumayı üstlenir, .htaccess ile siz bunu uygulama katmanında tamamlarsınız. 301 yönlendirmeleri, güvenlik header'ları, IP erişim kontrolü ve performans optimizasyonu için buradaki örnekleri şablona göre değil, kendi sitenizin ihtiyacına göre uyarlayın. Yüksek trafik noktasına ulaştığınızda performans kritik kuralları VDS sunucuya taşımayı değerlendirin.
Teknik destek ve .htaccess danışmanlığı için: 0850 302 60 70.
İlgili Büyükweb Hizmetleri
.htaccess ve cPanel yönetimi için:
- cPanel Web Hosting (LiteSpeed + CloudLinux)
- cPanel Reseller Hosting
- Plesk Web Hosting
- VDS Sunucu (vhost-level config)
- Tüm Paketler — Karşılaştırma
Sorularınız için 0850 302 60 70 numaralı destek hattımıza veya iletişim sayfamıza yazabilirsiniz.
cPanel & Plesk İlgili Hizmetlerimiz
Bu yazıda anlatılan teknik konuyu profesyonel altyapıyla deneyimleyin
Etiketler:

