Elektrofizyoloji ve kardiyoloji kliniklerinde hekimlerin en çok ilgilendiği doğumsal elektriksel anomalilerden biri "Wolff-Parkinson-White (WPW) Sendromu"dur. Sağlıklı bir kalpte elektriksel sinyal kulakçıklardan çıkar, AV düğümden geçer ve karıncıklara iner. Fakat WPW hastalarında kulakçık ile karıncık arasında doğuştan fazladan bir elektriksel köprü (Kent Demeti) bulunur. Sinyal aşağı indikten sonra sönmek yerine, o kaçak köprüden geriye kaçar ve kulakçıkları yeniden uyarır. Kalp kendi ürettiği uyarının peşine takılarak saniyede 240 kez kasılmaya başlar; bir kısır döngü (re-entry) içinde çırpınır ve kan pompalayamaz hale gelir. Dışarıdan bakan biri kalbin ne kadar hızlı çalıştığını zanneder; oysa kalp kendi yarattığı elektriksel labirentin içinde boğulmaktadır.
Web sunucusu mimarisinde ve Apache/Nginx altyapılarında da web geliştiricilerin kendi elleriyle yarattığı ve tarayıcıları saniyeler içinde komaya sokan en yaygın mimari hata tam olarak bu WPW re-entry döngüsüdür: Ters vekil (Reverse Proxy) arkasında çalışan bir sunucuda, .htaccess dosyasına ezbere SSL yönlendirmesi yazarak ERR_TOO_MANY_REDIRECTS tuzağına düşmek.
Olay Günü: Yeşil Kilit Aşkına Yapıştırılan Kod
Bir web geliştiricisi veya hevesli bir site sahibi, web sitesine yeni bir SSL sertifikası kurmuştur. Ziyaretçilerin http://sirketadi.com yazdıklarında otomatik olarak şifreli https://sirketadi.com adresine gitmesini istemektedir.
Google'a girer: "htaccess http to https redirect code".
Bir forumda veya eski bir blog yazısında bulduğu şu meşhur 3 satırlık kodu kopyalar ve sunucudaki .htaccess dosyasının en tepesine gururla yapıştırır:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]Kullanıcı dosyasını kaydeder. Tarayıcısını açar ve sirketadi.com adresine tıklar.
Ve o saniyede tarayıcı beyaz bir ekranda dönmeye başlar. Üstteki yükleme çubuğu çılgınlar gibi ileri geri gider. İki saniye sonra Chrome durur ve ekrana o buz gibi gri ölüm ekranını çarpar:
Bu sayfa çalışmıyor
sirketadi.com sizi çok fazla kez yönlendirdi.
Çerezleri temizlemeyi deneyin.
ERR_TOO_MANY_REDIRECTS
Kullanıcının tepkisi asla şaşmaz: Hemen hosting firmasına bilet açar:
"Sizin bana verdiğiniz SSL sertifikası bozuk! Sertifikayı kurdum, sitem 'Çok fazla yönlendirme' hatası verdi ve kapandı! Sertifikanızı düzeltin ya da paramı iade edin!"
Perdenin Arkasındaki Mimari: Ters Vekil Körlüğü
Kullanıcının anlamadığı şey, modern sunucuların 2005 yılındaki gibi tek bir çıplak Apache sunucusundan ibaret olmadığı gerçeğidir!
Modern ve hızlı hosting altyapılarında (veya Cloudflare kullanılan sistemlerde) mimari iki katmandan oluşur:
- Ön Uç (Front-End) - Nginx / Cloudflare: Ziyaretçiyi kapıda karşılayan ters vekildir (Reverse Proxy). Ziyaretçi ile Nginx arasındaki bağlantı tamamen şifrelidir: HTTPS (Port 443).
- Arka Uç (Back-End) - Apache / PHP-FPM: Nginx, statik dosyaları kendi sunar; dinamik PHP isteklerini ise sunucunun içindeki yerel Apache servisine (
localhost:8080) aktarır. Ve sunucu içi bu aktarım şifresiz düz HTTP (Port 80) üzerinden yapılır!
İşte WPW kaçak köprüsü tam burada kurulur!
- Ziyaretçi tarayıcısından
https://sirketadi.comyazar. - Nginx isteği karşılar; istek şifrelidir (HTTPS). Nginx içeriği çekmek için arka plandaki Apache'ye gider: "Bana bu sayfayı ver" (HTTP port 80 üzerinden!).
- Apache'deki o ezbere
.htaccesskuralı devreye girer:
RewriteCond %{HTTPS} off - Apache bakar: Kendisine gelen istek Nginx'ten HTTP ile gelmiştir! Yani Apache'nin gözünde
%{HTTPS}değeri kesinlikleoff'tur! - Apache emri uygular: "Dur! HTTPS kapalı, hemen
https://sirketadi.comadresine yönlen (301)!" - Yanıt tarayıcıya döner. Tarayıcı emre uyar, tekrar
https://sirketadi.comadresine gider. - Nginx isteği tekrar alır, Apache'ye tekrar HTTP üzerinden sorar.
- Apache tekrar "HTTPS'e git" der...
Tarayıcı ile sunucu arasında saniyede 20 turluk bir pinpon maçı başlar! Tarayıcı 20. turun sonunda pes eder ve emniyet kemerini çekerek ERR_TOO_MANY_REDIRECTS basar.
HTTP_X_FORWARDED_PROTO: Tercüman Başlığı
Apache'nin kör olmasının sebebi, Nginx'in arkasından konuştuğunu bilmemesidir. Oysa Nginx veya Cloudflare, isteği arkadaki Apache'ye aktarırken HTTP paketinin başlığına (header) bir tercüman notu iliştirir:
X-Forwarded-Proto: httpsBu başlık der ki: "Ey Apache! Ben bu isteği sana içeride HTTP ile iletiyorum ama bilesin ki kapıdaki ziyaretçi bana aslında HTTPS ile bağlandı!"
Eğer .htaccess dosyasında bu tercüman başlığını kontrol etmezseniz, sistem o sonsuz girdapta boğulmaya mahkûmdur.
Cerrahi Tedavi: Doğru Yönlendirme Kuralı
Bir ters vekil (Nginx veya Cloudflare) arkasında çalışan Apache sunucusunda SSL yönlendirmesi yapılacaksa yazılması gereken tek doğru ve kusursuz kural şudur:
RewriteEngine On
# 1. Klasik HTTPS kontrolü
RewriteCond %{HTTPS} off
# 2. VE Ters Vekil başlığı da https DEĞİLSE:
RewriteCond %{HTTP:X-Forwarded-Proto} !https
# 3. Sadece o zaman HTTPS'e yönlendir!
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]Bu kuralı .htaccess dosyasına yazdığınız saniyede o ölümcül re-entry halkası kırılır.
Apache pakete bakar: X-Forwarded-Proto başlığında https yazdığını görür. "Tamam, ziyaretçi zaten güvenli kanaldan gelmiş, yönlendirmeme gerek yok" der ve sayfayı 0.2 saniyede şak diye tarayıcıya teslim eder! Sitenin sol üstünde o parıl parıl parlayan yeşil asma kilit simgesi belirir.
Mimariyi Anlamadan Kod Kopyalamanın Sonu
İnternetten bulunan her kod parçası sizin özel sunucu mimarinize uymak zorunda değildir.
- Sunucunuz doğrudan internete mi açık, yoksa Nginx ters vekili arkasında mı?
- Önünüzde Cloudflare gibi bir CDN kalkanı var mı?
- Cloudflare SSL modunuz "Flexible" mı, yoksa "Full (Strict)" mi?
Bu soruların cevabını bilmeden körlemesine .htaccess düzenlemek, karanlık bir ameliyathanede neşteri rastgele sallamaktan farksızdır. Bir sistemin güvenliğini sağlamak sadece sertifika satın almakla bitmez; o sertifikanın üzerinden akan trafiğin hangi kapılardan geçtiğini bilmek ve kuralları mimarinin diline göre yazmak mühendisliğin ilk şartıdır.