Puan
18
Çözümler
0
- Katılım
- 3 Kas 2025
- Mesajlar
- 99
- Tepkime puanı
- 0
WordPress .htaccess Rehberi: Kalıcı Bağlantılar, Güvenlik ve Yönlendirme Ayarları
WordPress’te ana sayfa açıldığı hâlde yazıların 404 vermesi, HTTPS yönlendirmesinin döngüye girmesi veya bir yapılandırma değişikliğinden sonra 500 hatası oluşması,.htaccess dosyasını kontrol etmeyi gerektirebilir.Bu küçük dosya, uygun sunucu ortamında URL kurallarından dosya erişimine kadar birçok ayarı yönetir. Ancak internette bulunan her kodu aynı dosyaya eklemek doğru değildir. Kuralın yazımı, dosyadaki konumu ve sunucunun desteklediği özellikler sonucu belirler.
Bu rehberde WordPress’in standart
.htaccess yapısını, kullanışlı ek kuralları ve hata durumunda izlenecek adımları ele alacağız..htaccess Dosyası Nedir?
.htaccess, Apache web sunucusunda dizin düzeyinde yapılandırma yapmayı sağlayan bir dosyadır. Sunucunun ana ayarlarına erişmeden, belirli bir klasör ve altındaki içerik için kurallar tanımlanabilir.WordPress açısından en bilinen görevi, kalıcı bağlantıları çalıştırmaktır. Örneğin:
https://ornek.com/?p=123yerine şu adresin kullanılabilmesini sağlar:
https://ornek.com/wordpress-rehberi/Bunun yanında yönlendirmeler, erişim kısıtlamaları, dizin listeleme ve bazı önbellek başlıkları da bu dosya üzerinden yönetilebilir.
Dosyanın bulunması, içindeki bütün kuralların uygulanacağı anlamına gelmez. Apache’de hangi yönergelere izin verildiği
AllowOverride ve AllowOverrideList gibi sunucu ayarlarıyla belirlenir.Hangi sunucularda çalışır?
| Sunucu yapısı | .htaccess durumu |
|---|---|
| Apache | İzin verilen yönergeler uygulanır. |
| LiteSpeed Web Server | Birçok Apache kuralı desteklenir; uyumluluk yönergeye göre değişebilir. |
| Yalnızca Nginx | Dosya okunmaz; kurallar Nginx yapılandırmasında tanımlanır. |
| Nginx önünde, Apache arkasında | Apache’ye ulaşan isteklerde etkili olabilir; Nginx’in doğrudan sunduğu içerik ayrıca değerlendirilir. |
LiteSpeed’in Apache ile uyumlu olması, her Apache modülünün ve bütün yönergelerin aynı şekilde desteklendiği anlamına gelmez.
WordPress .htaccess Dosyası Nerede Bulunur?
Standart bir kurulumda.htaccess, sitenin belge kökünde; çoğunlukla index.php, wp-admin ve wp-content ile aynı dizinde bulunur.Hosting panelinde bu klasörün adı
public_html veya httpdocs olabilir. WordPress’in alt dizine kurulduğu ya da site giriş dosyasının farklı bir konumda bulunduğu yapılarda dosyanın yeri ve kurallar değişebilir.Dosya görünmüyorsa Dosya Yöneticisi veya bağlantı istemcisindeki gizli dosyaları göster seçeneğini açın. Adının başındaki nokta nedeniyle listede gizlenmiş olabilir.
Düzenleme öncesinde:
- Mevcut dosyanın bir kopyasını indirin.
- Eklemeyi düşündüğünüz kuralın amacını belirleyin.
- Her seferinde tek bir değişiklik yapın.
- Ana sayfayı, bir yazıyı ve yönetim panelini kontrol edin.
WordPress’in Standart .htaccess Kuralları
Alan adının kökünde çalışan, tek siteli bir WordPress kurulumu için yaygın temel yapı şöyledir:
Kod:
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
Temel satırların görevleri:
| Kural | Açıklama |
|---|---|
RewriteEngine On | Yeniden yazma işlemlerini etkinleştirir. |
HTTP_AUTHORIZATION satırı | Yetkilendirme başlığının uygulamaya aktarılmasına yardımcı olur. |
RewriteBase / | Bu örnekte kök dizin yolunu belirtir. |
^index\.php$ kuralı | Giriş dosyasının yeniden yazılmasını önler. |
!-f ve !-d koşulları | Gerçek dosya ve dizinleri sonraki kurala dahil etmez. |
Son RewriteRule | Diğer uygun istekleri içeride index.php üzerinden işler. |
Son işlem, ziyaretçiyi başka bir adrese gönderen 301 yönlendirmesi değildir. Tarayıcıdaki adres korunur; WordPress isteğin hangi içeriğe ait olduğunu çözümler.
Özel Kurallar Dosyanın Neresine Eklenmeli?
# BEGIN WordPress ve # END WordPress arasındaki bölüm WordPress tarafından yönetilir. Kalıcı bağlantı kuralları yeniden oluşturulduğunda buradaki elle yapılmış eklemeler kaybolabilir.Özel kuralları bu bölümün dışında tutun. Ancak her kuralın mutlaka WordPress bloğunun altına yazılması gerektiği düşüncesi yanlıştır.
Özellikle HTTPS geçişi ve eski sayfa yönlendirmeleri, WordPress’in genel yeniden yazma kuralından önce değerlendirilmelidir. Bu nedenle genellikle bloğun üstüne yerleştirilir.
Ayrıca önbellek ve güvenlik eklentileri kendi işaretli bölümlerini oluşturabilir. Bu alanların içine elle ekleme yapmadan önce eklentinin nasıl çalıştığını kontrol edin.
Hassas Dosyalara Web Erişimini Kısıtlama
Apache 2.4 için yeni erişim kuralları yazarkenRequire sözdizimi kullanılmalıdır. Eski Order, Allow ve Deny yönergeleri kullanımdan kaldırılmış kabul edilir; eski yapılandırmalarla yeni kuralları gelişigüzel karıştırmayın.wp-config.php dosyasını koruma
Aşağıdaki kuralı WordPress’in yönettiği bölümün dışına ekleyebilirsiniz:
Kod:
<Files "wp-config.php">
Require all denied
</Files>
Veritabanı bilgilerini içeren bu dosyanın yedeklerini de herkese açık dizinlerde tutmayın.
Belirli yapılandırma dosyalarını koruma
İhtiyaca göre şu dosya adları hedeflenebilir:
Kod:
<FilesMatch "^(?:\.env(?:\..*)?|\.user\.ini|\.htaccess|\.htpasswd)$">
Require all denied
</FilesMatch>
\. ifadesi gerçek nokta karakterini eşleştirir. Düzenli ifadelerde nokta, kaçış işareti olmadan kullanıldığında herhangi bir karakteri temsil eder.Örneğin
^. yazmak, “noktayla başlayan dosyalar” anlamına gelmez; neredeyse bütün dosya adlarını eşleştirebilir.Noktayla başlayan bütün yolları kontrolsüz biçimde engellemek de sorun oluşturabilir.
/.well-known/acme-challenge/ yolu, bazı SSL doğrulama işlemlerinde kullanılır.Dizin Listelemesini Kapatma
Bir klasörde uygun giriş dosyası yoksa ve sunucuda dizin listeleme açıksa, klasör içeriği ziyaretçilere gösterilebilir.Bunu kapatmak için:
Options -IndexesBu ayar dosyalara doğrudan erişimi tamamen engellemez; yalnızca otomatik klasör listesini kapatır.
Sağlayıcı
.htaccess içinde Options kullanımına izin vermiyorsa hata oluşabilir. Böyle bir durumda satırı kaldırıp ayarın sunucu veya panel üzerinden uygulanmasını isteyin.xmlrpc.php Erişimini Kapatmalı mısınız?
XML-RPC, bazı uzaktan yayın ve entegrasyon işlemlerinde kullanılır. İhtiyacınız yoksa erişimini kısıtlamak değerlendirilebilir:
Kod:
<Files "xmlrpc.php">
Require all denied
</Files>
Dosyanın engellenmesi, bütün saldırı türlerine karşı koruma sağlamaz. Güncel yazılım, güçlü hesap güvenliği ve uygun sunucu önlemleri ayrıca gereklidir.
Uploads Klasöründeki PHP Dosyalarına Erişimi Engelleme
wp-content/uploads çoğunlukla görsel ve belge yüklemeleri için kullanılır. Bu klasöre yüklenmiş çalıştırılabilir dosyalara web erişimini engellemek ek koruma sağlayabilir.Yalnızca
[B]wp-content/uploads[/B] içine ayrı bir .htaccess dosyası ekleyerek şu örnek kullanılabilir:
Kod:
<FilesMatch "(?i)\.(?:php[0-9]*|phtml|phar)(?:\.|$)">
Require all denied
</FilesMatch>
Kural, başka bir PHP dosyasının sunucu içinde zararlı kodu yüklemesini engelleyen tam bir izolasyon mekanizması değildir.
Aynı engeli bütün
wp-content dizinine uygulamayın. Tema ve eklentiler burada bulunduğu için sitenin işleyişi bozulabilir. Uploads içinde özel uygulama dosyaları kullanan bir sisteminiz varsa değişikliği önce test edin.Eski Bir Sayfayı Yeni Adrese Yönlendirme
Tek bir eski adresi yeni sayfaya yönlendirmek için, kök dizindeki.htaccess dosyasında WordPress bloğunun üstüne şu örnek eklenebilir:
Kod:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^eski-sayfa/?$ https://ornek.com/yeni-sayfa/ [R=302,L]
</IfModule>
Test sırasında
302 kullanmak, kalıcı yönlendirmenin tarayıcıda saklanması nedeniyle yaşanabilecek karışıklığı azaltır. Hedef doğru çalışıyorsa ve değişiklik kalıcıysa R=301 olarak düzenleyebilirsiniz..htaccess bağlamındaki bu örnekte eşleşen yolun başına / yazılmaz. ^ ve $ işaretleri de eşleşmeyi belirtilen adresle sınırlar.Eski sayfanın karşılığı varsa kullanıcıyı o sayfaya yönlendirin. Bütün kaldırılmış adresleri ana sayfaya göndermek, her durum için uygun bir çözüm değildir.
HTTP’den HTTPS’e Yönlendirme
Önce SSL sertifikasının geçerli olduğundan ve sitenin HTTPS adresinden düzgün açıldığından emin olun.HTTPS bağlantısının doğrudan ilgili web sunucusunda sonlandığı bir ortam için örnek:
Kod:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://ornek.com%{REQUEST_URI} [R=302,L]
</IfModule>
ornek.com yerine tercih ettiğiniz alan adını yazın. Kontrol tamamlandığında kalıcı geçiş için 302 değerini 301 yapabilirsiniz.Cloudflare veya başka bir ters proxy varsa yapı ayrıca değerlendirilmelidir. Ziyaretçi HTTPS kullanırken arka sunucu HTTP isteği alıyorsa, yalnızca
%{HTTPS} kontrolüne dayanan kural yönlendirme döngüsü oluşturabilir. Cloudflare’ın Flexible modu ile sunucudaki HTTPS zorlama ayarı buna örnektir.Panelde veya CDN’de zaten yönlendirme varsa aynı işlemi birden fazla yerde tekrar tanımlamadan önce mevcut yapıyı kontrol edin.
Tarayıcı Önbellekleme Ayarları
Statik dosyaların tarayıcıda saklanması, tekrar ziyaretlerde indirme ihtiyacını azaltabilir. Apache’demod_expires destekleniyorsa örnek bir yapı şöyledir:
Kod:
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType image/webp "access plus 1 month"
ExpiresByType text/css "access plus 1 week"
ExpiresByType text/javascript "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
</IfModule>
mod_expires, uygun yanıtlar için Expires ve Cache-Control: max-age başlıklarını oluşturabilir.Uzun süre önbelleğe alınan dosyayı aynı URL’de değiştirdiğinizde kullanıcı eski sürümü görmeye devam edebilir. Bu nedenle dosya sürümleme yöntemiyle önbellek süresi birlikte düşünülmelidir.
HTML, kullanıcı hesabı, sepet ve ödeme içeriklerine gelişigüzel uzun önbellek süreleri uygulamayın. Tarayıcı önbelleği ile WordPress sayfa önbelleği ayrı mekanizmalardır.
GZIP Sıkıştırma Kullanımı
Metin tabanlı içerikleri sıkıştırmak, aktarılacak veri miktarını azaltabilir:
Kod:
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/css text/javascript application/javascript application/json
</IfModule>
mod_deflate filtresini kullanır. Kazanç, içeriğe göre değişir; bütün dosyalar için sabit bir küçülme oranı beklenmez.Sunucu veya CDN zaten GZIP ya da Brotli uyguluyorsa ek kural gerekmeyebilir. Tarayıcının geliştirici araçlarında yanıtın
Content-Encoding başlığını kontrol edebilirsiniz..htaccess Hataları Nasıl Çözülür?
| Belirti | Kontrol edilecek noktalar |
|---|---|
| Değişiklikten sonra 500 hatası | Son eklenen kural, desteklenmeyen yönerge veya izin verilmeyen ayar |
| Ana sayfa açılıyor, yazılar 404 | Kalıcı bağlantı kuralları, mod_rewrite, doğru dosya konumu |
| Yönlendirme çalışmıyor | Kural sırası, adres eşleşmesi, proxy ve diğer yönlendirmeler |
| Sürekli yönlendirme oluşuyor | HTTP/HTTPS algısı, CDN modu, birbiriyle çelişen kurallar |
| Beklenmeyen 403 hatası | Require kuralları, hatalı dosya eşleştirmesi, dizin listeleme ayarı |
| Değişiklik etkisiz | Sunucu türü, AllowOverride, Nginx’in doğrudan sunduğu içerik veya önbellek |
Yeni bir düzenlemeden hemen sonra sorun başladıysa önce son değişikliği geri alın. Ardından sunucunun hata kaydını inceleyin.
Dosyanın tamamını kaldırmak, yönlendirme ve güvenlik kurallarını da devre dışı bırakabilir. Bu yüzden mümkünse bilinen çalışan kopyayı geri yükleyin.
Kalıcı bağlantı kuralları bozulmuşsa Ayarlar → Kalıcı Bağlantılar → Değişiklikleri Kaydet işlemi yardımcı olabilir. WordPress’in dosyayı otomatik güncelleyebilmesi için uygun yazma yetkisi gerekir. Sorunu çözmek amacıyla kontrolsüz biçimde
777 izni vermeyin.Sıkça Sorulan Sorular
.htaccess dosyasını silersem site tamamen kapanır mı?
Her kurulumda aynı sonuç oluşmaz. Dosyaya bağlı kalıcı bağlantılar, yönlendirmeler ve erişim kuralları kaybolabilir. Sunucu seviyesinde eşdeğer kurallar varsa bazı işlevler devam edebilir.Değişiklikten sonra sunucuyu yeniden başlatmak gerekir mi?
Apache’de.htaccess değişiklikleri genellikle sonraki istekte değerlendirilir. Ana sunucu yapılandırmasındaki değişiklikler ise farklıdır ve yeniden yükleme gerektirebilir.Dosyada IfModule varsa hata oluşmayacağı garanti mi?
Hayır.IfModule, ilgili modül yoksa bloğu atlamayı sağlar. Modül mevcutken yazım hatası veya izin verilmeyen bir yönerge yine sorun çıkarabilir..htaccess dosyası yoksa elle oluşturabilir miyim?
Sunucunuz destekliyorsa ve doğru dizini biliyorsanız oluşturabilirsiniz. Dosyanın adının tam olarak.htaccess olduğundan, sonuna .txt eklenmediğinden emin olun.
