Apache Üzerinde “Too Many Redirects” Hatası Çözümü
Apache Üzerinde “Too Many Redirects” Hatası Çözümü
“Too Many Redirects” (çok fazla yönlendirme) hatası, bir isteğin tarayıcı ile sunucu arasında döngüsel olarak yönlendirilmesi sonucu ortaya çıkar. Tarayıcı aynı URL’yi tekrar tekrar ziyaret eder ve sonunda “bu sayfa düzgün şekilde yönlendirilemiyor” şeklinde bir uyarı gösterir. Apache tabanlı ortamlarda bu hata genellikle .htaccess kuralları, HTTP → HTTPS veya www → non-www yönlendirmelerinin çakışması ya da uygulamanın kendi yönlendirmesiyle Apache’nin yönlendirmesinin üst üste binmesinden kaynaklanır.
- Hatanın Tipik Nedenleri
- 1) Tarayıcı Önbelleği ve Çerezleri Temizleyin
- 2) .htaccess Dosyasını Kontrol Edin
- 3) WordPress / Uygulama URL Ayarlarını Doğrulayın
- 4) Proxy / Cloudflare / Load Balancer Arkasında Çalışıyorsanız
- 5) Sanal Host (vhost) İçindeki Yönlendirmeleri Kontrol Edin
- 6) Sonsuz Döngüyü Teşhis Etme
- 7) Geçici Olarak .htaccess’i Devre Dışı Bırakın
- 8) HSTS / Tarayıcı Zorlamalarını Unutmayın
- Örnek Temiz .htaccess
- Sonuç
Hatanın Tipik Nedenleri
- .htaccess içinde hem www yönlendirmesi hem de HTTPS yönlendirmesi yanlış sırada veya çakışmalı yazılmıştır.
- Uygulama (ör. WordPress) site adresini
http://olarak kaydetmiştir ama .htaccess HTTPS’e zorlamaktadır. - Proxy / reverse proxy (Cloudflare, Nginx önde, Apache arkada) yanlış “X-Forwarded-Proto” bilgisini iletmez ve uygulama kendini HTTP sanır.
- Apache vhost’ta yönlendirme var, .htaccess’te de aynı yönlendirme tekrar ediyordur.
1) Tarayıcı Önbelleği ve Çerezleri Temizleyin
Önce basit adımla başlayın: Tarayıcı yönlendirmeleri çerez olarak tutabileceği için, siteye ait çerezleri silip tekrar deneyin. Kimi zaman sorun sadece istemci tarafında kalmış olabilir.
2) .htaccess Dosyasını Kontrol Edin
Apache’de en çok sorun çıkaran kısım .htaccess yönlendirmeleridir. Özellikle aşağıdaki iki senaryo çakışır:
- HTTP → HTTPS zorlaması
- www → non-www (veya tersi) zorlaması
Sağlıklı bir örnek kural şu şekildedir (www olmayanı HTTPS’e yönlendir):
RewriteEngine On
# HTTP'yi HTTPS'e zorla
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# www'yi kaldır (https://www.example.com → https://example.com)
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [L,R=301]
Eğer önce www yönlendirmesi yapıp sonra HTTPS’e zorlarken host adını değiştirirseniz döngü oluşabilir. Kuralları sadeleştirin: Aynı isteği iki farklı hedefe göndermeyin.
3) WordPress / Uygulama URL Ayarlarını Doğrulayın
WordPress gibi uygulamalarda Site Address (URL) ve WordPress Address (URL) alanları http:// olarak kayıtlıysa, .htaccess HTTPS’e yönlendirdiği için uygulama tekrar HTTP’ye dönmek isteyebilir ve döngü oluşur.
Geçici çözüm için wp-config.php içine ekleyin:
define('WP_HOME', 'https://example.com');
define('WP_SITEURL', 'https://example.com');
Sonra tekrar deneyin.
4) Proxy / Cloudflare / Load Balancer Arkasında Çalışıyorsanız
Eğer Apache gerçek isteği HTTP alıyor, ama kullanıcı aslında HTTPS ile geliyorsa (örneğin Cloudflare “Flexible SSL”), uygulama “HTTP geldi, HTTPS’e yönlendireyim” deyip durur. Bu da döngüye yol açar.
Apache tarafında şunu eklemek yardımcı olabilir:
SetEnvIf X-Forwarded-Proto "https" HTTPS=on
Böylece Apache, öndeki proxy’nin HTTPS kullandığını anlar ve yeniden yönlendirme yapmaz.
5) Sanal Host (vhost) İçindeki Yönlendirmeleri Kontrol Edin
Hem /etc/apache2/sites-enabled/ altındaki vhost dosyasında, hem de .htaccess’te yönlendirme varsa iki kez yönlendirme yapılabilir. Kuralın yalnızca bir yerde olmasını sağlayın.
Örnek vhost yönlendirmesi:
<VirtualHost *:80> ServerName example.com Redirect permanent / https://example.com/ </VirtualHost>
.htaccess’te de HTTPS’e zorlanıyorsa birini kaldırın.
6) Sonsuz Döngüyü Teşhis Etme
Tarayıcı geliştirici araçlarında (Network sekmesi) isteklerin 301/302 ile ileri geri zıplayıp zıplamadığını görebilirsiniz. example.com → www.example.com → example.com gibi gidip geliyorsa, host adını değiştiren iki kural çakışıyor demektir.
7) Geçici Olarak .htaccess’i Devre Dışı Bırakın
Hatanın gerçekten .htaccess’ten mi geldiğini görmek için:
mv .htaccess .htaccess.bak
Sayfayı yenileyin. Hata kayboluyorsa sorun .htaccess içeriğindedir; dosyayı satır satır sadeleştirerek yeniden oluşturun.
8) HSTS / Tarayıcı Zorlamalarını Unutmayın
Daha önce HSTS başlığı gönderdiyseniz (Strict-Transport-Security), tarayıcı “ben bu siteyi hep HTTPS açacağım” diye hatırlar. Siz HTTP’ye döndürmeye çalışıyorsanız yine döngüye düşer. HSTS’yi kaldırmanız veya süreyi kısaltmanız gerekebilir.
Örnek Temiz .htaccess
Aşağıdaki örnek çoğu küçük site için yeterlidir:
RewriteEngine On
# HTTPS zorunlu
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# Tek domain kullan (www'siz)
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [L,R=301]
Sonuç
“Too Many Redirects” hatası neredeyse her zaman iki farklı yerde yapılan ama aynı hedefe gitmeyen yönlendirmelerin çakışması nedeniyle oluşur. .htaccess, vhost, uygulama ayarları ve varsa proxy katmanını tek tek kontrol edip yalnızca tek bir yerden HTTP→HTTPS ve tek bir yerden www/non-www zorlaması yaparsanız sorun ortadan kalkar. Daha karmaşık kurumsal yapılarda ise önde Nginx/Cloudflare kullanıyorsanız X-Forwarded-Proto başlığını Apache’ye doğru iletmeniz gerektiğini unutmayın.