Kurulum Rehberleri

.htaccess ile 301 Yönlendirme

Apache'de .htaccess ile www, HTTPS ve eski adres yönlendirmelerini SEO değerini koruyarak kurmayı, test etmeyi ve döngü hatalarını çözmeyi anlatıyoruz.

Aurora YazılımEditör ekibi 6 dk okuma
.htaccess ile 301 Yönlendirme
htaccess yönlendirme nasıl yapılır?

htaccess yönlendirme için Apache'de mod_rewrite açık olmalı ve sitenin kök klasöründeki .htaccess dosyasına RewriteEngine On satırından sonra kurallar yazılmalıdır. Kalıcı taşımalarda R=301 bayrağı kullanılır; böylece tarayıcı ve arama motorları yeni adrese geçer, eski adresin sıralama değeri büyük ölçüde korunur. Kuralları önce curl -I ile test edin.

301 Yönlendirme Nedir, Ne Zaman Gerekir?

301 yönlendirme, bir adresin kalıcı olarak başka bir adrese taşındığını bildiren HTTP yanıtıdır. Tarayıcı ziyaretçiyi otomatik olarak yeni adrese götürür, arama motorları ise zamanla dizindeki eski adresi yenisiyle değiştirir.

302 ve 307 ise geçici yönlendirmelerdir; kampanya ya da bakım sayfası gibi kısa süreli durumlarda kullanılır. Kalıcı bir değişiklikte geçici yönlendirme kullanmak, arama motorunun eski adresi dizinde tutmaya devam etmesine yol açabilir.

Yönlendirme ihtiyacı genellikle şu durumlarda doğar: siteyi HTTPS'e taşımak, www ile www'siz sürümden birini seçmek, sayfa adreslerini değiştirmek, alan adı değiştirmek ya da yeni bir siteye geçmek. Site yenilemelerinde eski adreslerin tek tek eşlenmesi, SEO uyumlu web tasarımı sürecinin en kritik adımlarından biridir.

Önkoşullar: mod_rewrite ve AllowOverride

.htaccess dosyası yalnızca Apache ve Apache uyumlu sunucularda (LiteSpeed gibi) çalışır. Nginx bu dosyayı okumaz; Nginx kullanıyorsanız aynı kuralları sunucu bloğuna yazmanız gerekir, ayrıntılar Nginx kurulumu rehberimizde.

Paylaşımlı barındırmada mod_rewrite genellikle açıktır ve doğrudan kurallara geçebilirsiniz. Kendi sunucunuzu yönetiyorsanız modülü etkinleştirmeniz ve sanal konak ayarında AllowOverride değerini açmanız gerekir; aksi hâlde Apache .htaccess dosyasını tamamen yok sayar.

bashUbuntu / Debian
sudo a2enmod rewrite
sudo nano /etc/apache2/sites-available/ornek.com.conf
sudo apache2ctl configtest
sudo systemctl restart apache2
apacheSanal konak içinde
<Directory /var/www/ornek.com/public_html>
    AllowOverride All
    Require all granted
</Directory>

HTTPS ve www Yönlendirmesi

Bir site en az dört farklı adresle açılabilir: http ve https, www'li ve www'siz. Bunlardan tek bir asıl adres seçip diğer üçünü tek adımda ona yönlendirmek en temiz çözümdür. Zincirleme yönlendirme (önce HTTPS'e, sonra www'ye) hem yavaştır hem de tarama bütçesini boşa harcar.

HTTPS yönlendirmesine geçmeden önce sunucuda geçerli bir sertifika olduğundan emin olun; kurulumu SSL sertifikası kurulumu rehberinde anlattık. Sertifika yokken HTTPS'e yönlendirmek ziyaretçinin güvenlik uyarısıyla karşılaşmasına yol açar.

HTTPS'in neden artık bir tercih değil zorunluluk olduğunu ve sertifika türlerini SSL sertifikası nedir yazımızda ayrıntılı anlattık. Asıl adresinizi seçtikten sonra kanonik etiketlerin, site haritasının ve iç bağlantıların da bu adresi kullandığından emin olun; aksi hâlde arama motoruna çelişkili sinyaller gönderirsiniz.

www'siz ve HTTPS'e zorlama

Aşağıdaki kural, HTTPS kapalıysa ya da adres www ile başlıyorsa isteği tek seferde https ve www'siz adrese yönlendirir. Son koşul alan adını yakalar, %1 bu yakalanan değeri kullanır.

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

www'li ve HTTPS'e zorlama

Asıl adresiniz www'li sürümse kuralı şöyle yazın.

apache
RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^ https://www.%1%{REQUEST_URI} [L,R=301]

Eski Sayfa, Klasör ve Alan Adı Taşıma

Adres yapısı değiştiğinde her eski sayfanın içerik olarak en yakın yeni sayfaya yönlenmesi gerekir. Tüm eski adresleri anasayfaya yönlendirmek kolay görünür ama arama motorları bunu çoğu zaman soft 404 olarak değerlendirir ve eski sayfanın değeri kaybolur.

Kuralların sırası önemlidir: özel kurallar yukarıda, genel kurallar aşağıda olmalıdır. Apache kuralları yukarıdan aşağı işler ve L bayrağı eşleşen kuraldan sonra o turdaki işlemeyi durdurur.

Büyük taşımalarda işe bir yönlendirme haritası hazırlayarak başlayın: bir tabloda solda eski adres, sağda yeni adres, yanında da sayfanın aldığı trafik ve bağlantı sayısı olsun. Bu liste hem kuralları yazarken hem de yayından sonra tek tek kontrol ederken size yol gösterir. Karşılığı olmayan, gerçekten kaldırılan sayfalar için yönlendirme yerine 410 ya da 404 yanıtı vermek daha dürüst bir sinyaldir.

  • Tek sayfalık basit taşımalarda mod_alias'ın Redirect 301 satırı da kullanılabilir, ancak aynı dosyada RewriteRule ile karıştırmamak sırayla ilgili sürprizleri önler.
  • Eski adreslerin listesini Search Console ve eski site haritasından çıkarın; hiçbir önemli sayfayı atlamayın.
  • Alan adı değişikliğinde Search Console'daki Adres değişikliği aracını da kullanın.
apache
RewriteEngine On

# Tek sayfa
RewriteRule ^eski-sayfa\.html$ /yeni-sayfa/ [R=301,L]

# Klasör taşıma: /haberler/... -> /blog/...
RewriteRule ^haberler/(.*)$ /blog/$1 [R=301,L]

# Sorgu dizesini atarak yönlendirme
RewriteCond %{QUERY_STRING} ^id=15$
RewriteRule ^urun\.php$ /urunler/deri-canta/ [R=301,L,QSD]

# Alan adı değişikliği (eski alan adının .htaccess dosyasında)
RewriteCond %{HTTP_HOST} ^(www\.)?eskialan\.com$ [NC]
RewriteRule ^(.*)$ https://yenialan.com/$1 [R=301,L]

.html Uzantısını Kaldırma

Statik sitelerde /hakkimizda.html yerine /hakkimizda gibi temiz adresler kullanmak isteyebilirsiniz. Bunun için iki kural gerekir: biri uzantılı istekleri uzantısız adrese 301 ile yönlendirir, diğeri uzantısız isteği arka planda ilgili .html dosyasına bağlar.

İlk kuralda %{THE_REQUEST} kullanılması önemlidir; bu değişken tarayıcının gönderdiği özgün isteği tutar ve iç yeniden yazmanın tekrar yönlendirmeye dönüşerek sonsuz döngü oluşturmasını engeller.

apache
RewriteEngine On

# /sayfa.html -> /sayfa (301)
RewriteCond %{THE_REQUEST} \s/([^.\s]+)\.html[\s?] [NC]
RewriteRule ^ /%1 [R=301,L]

# /sayfa isteğini sayfa.html dosyasına bağla (iç yeniden yazma)
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.+)$ $1.html [L]

Yönlendirmeleri Nasıl Test Ederim?

Tarayıcılar 301 yanıtını önbelleğe alır. Yanlış bir kuralı düzelttiğinizde tarayıcınız eski yönlendirmeyi hatırlamaya devam edebilir; bu yüzden test sırasında önce R=302 kullanın, her şey doğruysa 301'e çevirin. Testleri gizli pencerede ya da komut satırından yapmak en güvenilir yoldur.

curl komutu yanıt kodunu ve Location başlığını açıkça gösterir. -L parametresiyle zincirin tamamını izleyebilir, birden fazla adım varsa bunları tek yönlendirmeye indirebilirsiniz.

  • Windows PowerShell'de curl yerine curl.exe yazın; aksi hâlde farklı bir komut çalışabilir.
  • Yerelde denemek için XAMPP gibi Apache içeren bir paket kullanabilirsiniz.
  • Canlıya aldıktan sonra Search Console'da yönlendirme ve dizine ekleme raporlarını birkaç hafta izleyin.
bashmacOS, Linux ve Windows 10/11
curl -I http://www.ornek.com/eski-sayfa.html
# Tüm zinciri görmek için
curl -sIL http://ornek.com | grep -iE '^(HTTP|location)'

Sık Hatalar ve Çözümleri

Yönlendirme sorunlarının çoğu birkaç tanıdık belirtiyle ortaya çıkar. Apache hata kaydı (Ubuntu'da /var/log/apache2/error.log) genellikle sorunun hangi satırda olduğunu söyler.

BelirtiOlası neden ve çözüm
500 Internal Server ErrorYazım hatası ya da mod_rewrite kapalı; son eklenen satırı geri alıp hata kaydına bakın.
ERR_TOO_MANY_REDIRECTSKurallar birbirine yönlendiriyor ya da vekil arkasında HTTPS algılanmıyor.
Kural hiç çalışmıyorAllowOverride None ya da dosya yanlış klasörde; sanal konak ayarını kontrol edin.
Yeni adres 404 veriyorHedef yol yanlış ya da göreli yazılmış; hedefin başına / ekleyin.
Düzeltme görünmüyorTarayıcı eski 301'i önbellekten kullanıyor; gizli pencerede ya da curl ile test edin.

Cloudflare ya da yük dengeleyici arkasında

SSL vekilde sonlanıyorsa sunucuya gelen istek her zaman HTTP görünür ve %{HTTPS} off koşulu sonsuz döngüye yol açar. Bu durumda vekilin gönderdiği X-Forwarded-Proto başlığını kontrol edin ya da HTTPS yönlendirmesini vekil panelinden yapın.

apache
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Sık Sorulan Sorular

01301 yönlendirme SEO değerini tamamen taşır mı?

Doğru hedefe yapılan kalıcı yönlendirme, eski adresin sinyallerinin büyük kısmını yeni adrese aktarır. Yine de geçiş döneminde sıralamalarda geçici dalgalanma görülebilir; içeriği eşleşmeyen hedeflere yapılan yönlendirmeler ise değer kaybına yol açar.

02Yönlendirmeleri ne kadar süre tutmalıyım?

Eski adreslere başka sitelerden bağlantı geldiği sürece yönlendirmeleri kaldırmayın. Pratikte en az bir yıl, önemli sayfalar için süresiz tutmak en güvenli yaklaşımdır.

03Sondaki eğik çizgi için de yönlendirme gerekir mi?

Arama motorları /hakkimizda ile /hakkimizda/ adreslerini ayrı sayfa olarak görebilir. Hangisini kullanacağınıza karar verip diğerini 301 ile ona yönlendirmek, aynı içeriğin iki adreste dizine eklenmesini önler. Önemli olan seçimin tüm sitede tutarlı olmasıdır.

04Çok sayıda yönlendirme siteyi yavaşlatır mı?

Birkaç yüz satırlık kural fark edilir bir yavaşlık yaratmaz, ancak .htaccess her istekte okunduğu için binlerce satır ek yük getirir. Bu ölçekte kuralları sanal konak yapılandırmasına ya da RewriteMap ile bir eşleme dosyasına taşımak daha verimlidir.

Doğru kurulmuş 301 yönlendirmeler, adres değişikliğinde emeğinizin ve trafiğinizin kaybolmamasını sağlar. Site yenilerken eski adres eşlemesini, yönlendirmeleri ve teknik SEO kontrollerini birlikte yürütmek isterseniz SEO uyumlu web tasarımı hizmetimizi, yayın sonrası hız iyileştirmeleri için hız ve performans yönetimi çalışmamızı inceleyin. Arama verilerinizi düzenli izlemek için SEO ve analiz desteğimizden de yararlanabilir, e-ticaret altyapısı taşıma projelerinde web tasarımı ekibimizle birlikte çalışabilirsiniz.