Buyukweb
cPanel .htaccess: 301 Yönlendirme ve Güvenlik Kuralları

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.

Büyükweb Editör EkibiHosting, Sunucu ve Sistem Yönetimi Editörü12 dakika okuma

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.

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:

  1. Dosyayı yeniden adlandırın: cPanel File Manager'dan .htaccess.htaccess-bak. Site açılırsa sorun .htaccess'te.
  2. Hata loguna bakın: cPanel > Logs > Error Log. Sözdizimi hatası olan satırı gösterir.
  3. 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.

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:

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:

#cpanel#güvenlik#plesk#hosting yönetimi#kontrol paneli

Bu yazıyı paylaş