Acil serviste açık ve aktif kanaması olan bir travma vakasına yaklaştığınızda ilk kural hemostazı sağlamaktır. Damar yolunu açıp steril bir santral venöz kateter (CVC) taktığınızda, hastanın dolaşım sistemine güvenli, izole ve enfeksiyondan arındırılmış bir koridor kazandırırsınız. Ancak kateteri takıp eski açık, enfekte ve kan sızdıran periferik damar girişini açıkta bırakırsanız; orayı klemplemez ve kapatmazsanız, hastanın dolaşımına bir yandan steril serum girerken diğer yandan açık yaradan sepsis ajanları dolmaya devam eder. Kateterin steril olması, açıkta duran yaranın yarattığı hemodinamik kaosu sıfırlamaz.
Web altyapılarında da durum farksızdır. Let's Encrypt, Sectigo veya DigiCert üzerinden domaininize bir TLS sertifikası tanımladığınızda, sisteminize modern bir şifreleme katmanı (TLS 1.3) eklersiniz. Ancak web sunucunuzda (Nginx, Apache veya Caddy) 80 numaralı porttan gelen düz metin (plaintext) http:// isteklerini zorunlu bir 301 Moved Permanently ile 443 numaralı https:// portuna yönlendirmezseniz; dijital dünyada çift başlı, şizofrenik bir mimari inşa etmiş olursunuz.
Sertifika vardır, yeşil kilit ikonu elle yazıldığında görünür; fakat kapıdaki nöbetçi şifresiz gelen her yolcuyu içeri almaya devam eder.
Dijital Yarılma: Bir Alan Adı, İki Ayrı Evren
Web sunucusu düzeyinde HTTP-HTTPS yönlendirmesi yapılmadığında, sistem mimarisi arama motorları ve kullanıcılar açısından iki tamamen bağımsız siteye bölünür:
┌──────────────────────┐
│ İstemci / Bot │
└──────────┬───────────┘
│
┌────────────────┴────────────────┐
▼ ▼
Port 80 (HTTP) Port 443 (HTTPS)
[Şifresiz / Açık Metin] [TLS Şifreli / Güvenli]
- Man-in-the-Middle Riski - Modern HTTP/2 & HTTP/3
- Googlebot: Kopya Site A - Googlebot: Kopya Site B
- Form Verileri Açıkta - Güvenli Çerezler (Secure Flag)
│ │
└───────────────┬─────────────────┘
▼
[Aynı Veritabanı ve Uygulama]
- Duplicate Content Cezası
- Canonical Etiket Çatışması
- Güvenlik İllüzyonu
Yazılımcı veya sistem yöneticisi tarayıcısına https://example.com yazar, sertifikanın çalıştığını görür ve "İşimiz bitti, SSL tamamlandı" diyerek sunucudan çıkar. Oysa gerçek dünya bu şekilde işlemez.
1. Arama Motoru İnfazı: Duplicate Content (Mükerrer İçerik)
Googlebot veya Bingbot gibi tarayıcı indeksleme örümcekleri protokol farkını katı bir şekilde algılar. Onlar için http://example.com/urun/12 ile https://example.com/urun/12 aynı sayfa değildir; iki ayrı kaynaktır.
Eğer 301 yönlendirmesi yoksa:
- İç Bağlantı Çatışması: Sitenin eski şablonlarında, veritabanında veya harici geri bağlantılarda (backlink)
http://kalmışsa, örümcek her iki sürümü de ayrı ayrı tarar. - PageRank Dağılması: Alan adınızın edindiği otorite puanı (link equity) iki protokol arasında yarı yarıya bölünür.
- Mükerrer İçerik Cezası: Arama motoru aynı metin ve HTML yapısına sahip iki farklı URL gördüğünde, sitenizi "içerik kopyalayan" veya "kanonik otoritesi belirsiz" bir sistem olarak sınıflandırır ve arama sonuçlarında her iki sürümü de geriye iter.
2. Güvenlik İllüzyonu ve Man-in-the-Middle (MitM)
Bir e-ticaret veya kurumsal portal düşünün. Giriş sayfasında SSL sertifikası vardır. Ancak kullanıcı adres çubuğuna sadece firma.com yazıp Enter'a bastığında, varsayılan olarak tarayıcılar http://firma.com isteği atar (eğer HSTS ön yükleme listesinde değilseniz).
Eğer sunucunuz 80 portunu doğrudan yanıtlıyorsa, kullanıcı bir kafede açık Wi-Fi ağındayken bir saldırgan (ARP Spoofing veya DNS Hijacking ile) trafiği araya girip yakalayabilir:
- Kullanıcıya şifresiz HTTP sürümünü sunmaya devam eder (SSL Stripping saldırısı).
- Kullanıcı giriş yaptığında şifreler, oturum çerezleri (session tokens) ve kişisel veriler açık metin olarak saldırganın eline geçer.
- Sistem yöneticisi ise sunucu loglarında HTTPS trafiğini izleyip sistemin korunduğunu zanneder.
Nginx ve Apache Üzerinde Klinik Müdahale
Bu patolojiyi ortadan kaldırmak karmaşık bir mimari gerektirmez; ancak kuralın eksiksiz ve atomik yazılması şarttır.
Nginx İçin Doğru Reçete
Birçok acemi sistem yöneticisi Nginx yapılandırmasında if ($scheme = http) bloğu kullanır. Nginx mimarisinde if direktifleri performans maliyeti ve beklenmedik yan etkiler doğurur (If is Evil). Doğru yaklaşım, 80 numaralı port için bağımsız bir sunucu bloğu (server block) açıp tüm trafiği kesin bir 301 ile HTTPS'e postalamaktır.
# /etc/nginx/sites-available/example.com.conf
# Port 80: Yalnızca HTTP trafiğini dinler ve 301 ile fırlatır
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
# Let's Encrypt ACME challenge için istisna (isteğe bağlı)
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
# Tüm istekleri kesin 301 kalıcı yönlendirmesiyle HTTPS'e aktar
location / {
return 301 https://$host$request_uri;
}
}
# Port 443: Güvenli ve asıl uygulamanın çalıştığı blok
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example.com www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# Modern TLS parametreleri
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
# HSTS: Tarayıcıya bir sonraki isteklerde HTTP'yi tamamen unutmasını emreder
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
root /var/www/example.com/public;
index index.html index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}Apache İçin .htaccess Reçetesi
Apache kullanan paylaşımlı hosting veya VPS ortamlarında mod_rewrite modülü aktif edilmeli ve yönlendirme .htaccess dosyasının en tepesine, diğer tüm kurallardan önce eklenmelidir:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>
# HSTS Güvenlik Başlığı
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
</IfModule>302 Değil, Neden Israrla 301?
Bazen yazılımcıların yönlendirmeyi kod tarafında header("Location: https://..."); şeklinde yazdığı ve varsayılan olarak HTTP durum kodu belirtmedikleri görülür. Çoğu framework veya dil varsayılan olarak 302 Found (geçici yönlendirme) döner.
Klinik açıdan 301 ile 302 arasındaki fark hayatidir:
- 302 (Geçici): Arama motoruna "Ben şimdilik buradayım ama eski HTTP adresim hala geçerli, indeksini silme" mesajı verir. Arama motoru eski indeksi hafızasında tutmaya devam eder; link gücü yeni adrese aktarılmaz.
- 301 (Kalıcı): Arama motoruna "HTTP artık öldü, mezarı burasıdır, tüm itibarını ve geçmişini kalıcı olarak HTTPS adresine taşı" der. Botlar eski adresi arşivden çıkarır ve tüm otoriteyi güvenli URL'ye aktarır.
HSTS (HTTP Strict Transport Security): Kapıyı Çift Kilitlemek
Yönlendirme yapmak ilk adımdır; ancak kullanıcının ilk isteği hala HTTP üzerinden gider. Araya giren bir saldırganın bu ilk isteği bozmasını engellemek için HSTS devreye sokulmalıdır.
HSTS başlığı alan bir tarayıcı, belirtilen süre (max-age) boyunca kullanıcı adresi http:// olarak yazsa bile ağa çıkmadan önce yerel olarak isteği https:// protokolüne çevirir. Bu, açık yaranın üzerine antibakteriyel bariyer çekmek gibidir.
Sonuç
Bir sunucuya TLS sertifikası kurmak, ameliyathaneye steril masa getirmekten ibarettir. Masanın üzerinde ameliyat yapabilmeniz için hastayı ve ekibi o steril alana taşımalı, sokaktaki tozlu koridorları mühürlemelisiniz.
HTTP trafiğini 301 ile HTTPS'e zorunlu kılmayan her web projesi; güvenlik açısından açık bir kapı, arama motoru optimizasyonu açısından ise kendi ayağına sıkan bir mükerrer içerik fabrikasıdır. Altyapınızı yarım bırakmayın; güvenli tüneli bir seçenek değil, kaçınılmaz bir kural haline getirin.