Apache Üzerinde “Too Many Redirects” Hatası Çözümü

Apache Üzerinde “Too Many Redirects” Hatası Çözümü
Yazı Özetini Göster

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

  • .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:

  1. HTTP → HTTPS zorlaması
  2. 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.

Bir Yorum Yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Benzer Yazılar