Web sunucusu

Tüm Detaylarıyla .htaccess ile 301 Sayfa Yönlendirme

.htaccess ile tek sayfa, klasör, alan adı, HTTPS ve www yönlendirmesi; WordPress’te doğru sıra, test yöntemi ve sık yapılan hatalar. Kopyalayıp kullanabileceğiniz örneklerle.

Muhammet İkbal Yıldız27 Eylül 2023Ekim 2026’da güncellendi5 dakikalık okuma

301 yönlendirme nedir?

301, bir sayfanın kalıcı olarak başka bir adrese taşındığını tarayıcıya ve arama motorlarına bildiren sunucu cevabıdır. Ziyaretçi eski adresi açtığında, fark etmeden yeni adrese götürülür.

Taşındığınızda postaneye adres değişikliği bildirmek gibi düşünün. Eski adrese gelen mektuplar kaybolmaz, yeni evinize ulaşır. 301 de eski sayfanın kazandığı bağlantı değerini ve sıralamayı büyük ölçüde yeni sayfaya taşır.

301 ne zaman kullanılır?

301 ve 302 farkı

301: Kalıcı taşıma

“Bu sayfa artık burada değil, bundan sonra hep yeni adreste.” Arama motorları zamanla dizindeki eski adresi yenisiyle değiştirir.

302: Geçici taşıma

“Sayfa kısa bir süreliğine başka yerde, sonra geri dönecek.” Bakım sayfası ya da kısa süreli kampanya gibi durumlar için uygundur. Arama motorları eski adresi dizinde tutmaya devam eder.

Fark

Kalıcı bir taşımada 302 kullanmak en sık yapılan hatalardan biridir. Yeni sayfa bir türlü eski sayfanın yerini alamaz. Taşıma kalıcıysa her zaman 301 kullanın.

.htaccess dosyası nedir?

.htaccess, Apache ve LiteSpeed sunucularda çalışan küçük bir ayar dosyasıdır. Sitenin ana klasöründe (genellikle public_html) bulunur ve sunucuya “bu adrese gelen isteği şuraya gönder” gibi kurallar verir.

Dosya adı noktayla başladığı için gizli dosyadır. cPanel’deki Dosya Yöneticisi’nde görmek için ayarlardan “gizli dosyaları göster” seçeneğini açmanız gerekir.

Önce yedek alın

.htaccess’teki tek bir yazım hatası bütün siteyi “500 Internal Server Error” ile kapatabilir. Değişiklik yapmadan önce dosyanın bir kopyasını bilgisayarınıza indirin. Site açılmazsa yedeği geri yüklemeniz yeterli.

Tek bir sayfayı yönlendirmek

En basit yöntem Redirect 301 komutudur. Önce eski adres (alan adı olmadan), sonra yeni adresin tamamı yazılır:

.htaccess
# Eski sayfayı yeni sayfaya kalıcı olarak yönlendir
Redirect 301 /eski-sayfa/ https://www.ornek.com/yeni-sayfa/

Birden fazla sayfa için her biri ayrı satıra yazılır:

.htaccess
# Her satır bir yönlendirme
Redirect 301 /hakkimizda.html https://www.ornek.com/hakkimizda/
Redirect 301 /iletisim.php https://www.ornek.com/iletisim/
Redirect 301 /urunler/eski-urun/ https://www.ornek.com/urunler/yeni-urun/

RewriteRule ile esnek yönlendirme

Kurallar karmaşıklaştıkça mod_rewrite kullanılır. Önce motor açılır, sonra kurallar yazılır:

.htaccess
# Yönlendirme motorunu aç (dosyada bir kez yazılması yeterli)
RewriteEngine On

# ^ satır başı, $ satır sonu demek: tam olarak bu adresi yakala
RewriteRule ^eski-sayfa/?$ /yeni-sayfa/ [R=301,L]

Köşeli parantez içindeki işaretlerin anlamı şöyle:

İşaretAnlamı
R=301Kalıcı yönlendirme yap
LBu kural uyduysa aşağıdaki kurallara bakma
NCBüyük-küçük harf farkını önemseme
NEAdresteki özel karakterleri bozmadan aktar
QSDEski adresteki ? sonrasını yeni adrese taşıma
İki yöntemi karıştırmayın

Aynı dosyada hem Redirect hem RewriteRule kullanmak, kuralların beklenmedik sırayla çalışmasına yol açabilir. Sitede RewriteRule varsa (WordPress’te her zaman vardır) yönlendirmeleri de RewriteRule ile yazmak daha güvenlidir.

HTTPS ve www yönlendirmesi

Bir site dört farklı adresten açılabilir: http://ornek.com, http://www.ornek.com, https://ornek.com ve https://www.ornek.com. Arama motorları bunları dört ayrı site gibi görebilir. Hepsini tek bir adrese toplamak gerekir.

Sadece HTTPS’ye zorlamak

.htaccess
RewriteEngine On
# Bağlantı güvenli değilse...
RewriteCond %{HTTPS} off
# ...aynı adresin https sürümüne gönder
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,NE,R=301]

HTTPS ve www’yu tek seferde

Ziyaretçiyi iki ayrı yönlendirmeden geçirmek yerine tek adımda doğru adrese götürmek daha iyidir:

.htaccess
RewriteEngine On
# https kapalıysa VEYA adres www ile başlamıyorsa...
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\. [NC]
# alan adını www olmadan yakala (%1 olarak kullanılacak)
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
# hepsini https://www. ile başlayan tek adrese gönder
RewriteRule ^ https://www.%1%{REQUEST_URI} [L,NE,R=301]

www’suz adresi tercih ediyorsanız son iki satırı şöyle değiştirin:

.htaccess
RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [L,NE,R=301]
Cloudflare kullanıyorsanız

Cloudflare’in “Flexible SSL” modunda sunucu isteği her zaman http olarak görür ve yukarıdaki kural sonsuz döngüye girer. SSL modunu “Full” yapın ya da HTTPS yönlendirmesini Cloudflare panelinden açın.

Klasör ve alan adı taşıma

Bir klasörün tamamını taşımak

/blog/ altındaki tüm yazılar /yazilar/ altına taşındıysa, her sayfayı tek tek yazmanıza gerek yok:

.htaccess
RewriteEngine On
# (.*) "geri kalan her şey" demek; $1 ile yeni adrese eklenir
RewriteRule ^blog/(.*)$ /yazilar/$1 [L,R=301]

Alan adını değiştirmek

Eski alan adındaki .htaccess dosyasına yazılır. Her sayfa, yeni alan adındaki aynı adrese gider:

.htaccess
RewriteEngine On
RewriteCond %{HTTP_HOST} ^(www\.)?eskisite\.com$ [NC]
RewriteRule ^(.*)$ https://www.yenisite.com/$1 [L,R=301]

Alan adı taşındıktan sonra Search Console’daki “Adres değişikliği” aracını da kullanmayı unutmayın.

Parametreli adresleri yönlendirmek

Eski sistemlerde urun.php?id=15 gibi adresler sık görülür. RewriteRule, ? sonrasını göremez; bunun için ayrı bir koşul yazılır:

.htaccess
RewriteEngine On
# Adresin ? sonrası tam olarak id=15 ise...
RewriteCond %{QUERY_STRING} ^id=15$
# ...yeni adrese gönder, eski parametreyi taşıma (QSD)
RewriteRule ^urun\.php$ /urunler/kirmizi-kalem/ [QSD,L,R=301]

WordPress kullanıyorsanız

WordPress, .htaccess dosyasına kendi kurallarını # BEGIN WordPress ve # END WordPress satırları arasına yazar. Bu bölüm her kalıcı bağlantı ayarı kaydedildiğinde yeniden oluşturulur.

Kendi yönlendirmelerinizi bu bloğun üstüne yazın. Altına yazılan kurallar çoğu zaman hiç çalışmaz, çünkü WordPress isteği daha önce yakalar. Bloğun içine yazılanlar ise bir sonraki güncellemede silinir.

.htaccess
# Kendi yönlendirmelerim: her zaman en üstte
RewriteEngine On
RewriteRule ^eski-yazi/?$ /yeni-yazi/ [L,R=301]

# BEGIN WordPress
# (Bu bölüme dokunmayın)
# END WordPress

Yönlendirmeyi test etmek

Tarayıcılar 301 cevaplarını uzun süre hafızada tutar. Yanlış bir yönlendirmeyi düzeltseniz bile tarayıcınız eski sonucu göstermeye devam edebilir. Bu yüzden testi gizli pencerede ya da komut satırından yapın:

Terminal
# -I sadece sunucunun cevap başlıklarını gösterir
curl -I https://www.ornek.com/eski-sayfa/

# Beklenen cevap:
# HTTP/1.1 301 Moved Permanently
# Location: https://www.ornek.com/yeni-sayfa/

Komut satırı kullanmıyorsanız, “redirect checker” diye aratarak bulacağınız ücretsiz çevrimiçi araçlar da aynı bilgiyi verir.

Sık yapılan hatalar

Sonsuz döngü

A sayfası B’ye, B sayfası A’ya yönlendirilirse tarayıcı “çok fazla yönlendirme” hatası verir. Özellikle HTTPS kurallarında ve Cloudflare kullanımında sık görülür.

Yönlendirme zinciri

A’dan B’ye, B’den C’ye, C’den D’ye giden zincirler hem siteyi yavaşlatır hem de bağlantı değerini zayıflatır. Eski adresleri her zaman doğrudan son adrese yönlendirin.

Her şeyi ana sayfaya göndermek

Silinen yüzlerce sayfayı topluca ana sayfaya yönlendirmek kolay görünür, ama Google bunu çoğu zaman “yumuşak 404” sayar. Her eski sayfayı, konusu en yakın yeni sayfaya yönlendirin. Karşılığı olmayan sayfalar için düzgün bir 404 sayfası daha doğrudur.

Kalıcı taşımada 302 kullanmak

Bazı eklentiler ve paneller varsayılan olarak 302 kullanır. Ayarı kontrol edin.

Kısa kontrol listesi

Muhammet İkbal Yıldız
Bayburt Üniversitesi Bilgisayar Programcılığı öğretim görevlisi. Teknik SEO, veri madenciliği ve web üzerine yazıyor.