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?
- Bir sayfanın adresi (slug) değiştiğinde
- Site
http’denhttps’ye geçtiğinde www’lu vewww’suz adreslerden biri seçildiğinde- Bir klasör ya da bölüm başka yere taşındığında
- Alan adı değiştiğinde
- İki benzer sayfa tek sayfada birleştirildiğinde
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.
.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:
# 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:
# 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:
# 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:
| İşaret | Anlamı |
|---|---|
R=301 | Kalıcı yönlendirme yap |
L | Bu kural uyduysa aşağıdaki kurallara bakma |
NC | Büyük-küçük harf farkını önemseme |
NE | Adresteki özel karakterleri bozmadan aktar |
QSD | Eski adresteki ? sonrasını yeni adrese taşıma |
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
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:
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:
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’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:
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:
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:
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.
# 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 WordPressYö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:
# -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
- Değişiklikten önce .htaccess dosyasının yedeği alındı.
- Kalıcı taşımalarda 302 değil 301 kullanıldı.
- Site tek bir adresten açılıyor (https ve www kararı verildi).
- WordPress’te kurallar
# BEGIN WordPressbloğunun üstünde. - Zincir yok; her eski adres doğrudan son adrese gidiyor.
- Silinen sayfalar ana sayfaya değil, en yakın konulu sayfaya yönlendirildi.
- Her yönlendirme gizli pencerede ya da
curl -Iile test edildi.