Apache HTTPD: HTTPS İsteğine Cevap Vermeyen Sanal Host Sorunu ve Çözümü

  • Konu başlatıcı Konu başlatıcı Sir Alpha
  • Başlangıç Tarihi Başlangıç Tarihi

Sir Alpha

★ Destekçi Penguen ★
Katılım
23 Temmuz 2026
Mesajlar
8
Konum
Ankara
İşletim Sistemi
Apache'de hem güvenli (HTTPS) hem de güvensiz (HTTP) siteleri aynı sunucuda barındırırken karşılaşılan klasik bir sorun bu. Güvensiz siteye HTTPS ile erişmeye çalışınca Apache'nin ilk tanımlı SSL sanal host'unun sertifikasını döndürmesi can sıkıcı.

Sorunun kaynağı aslında basit: Apache, HTTPS isteği geldiğinde SNI (Server Name Indication) ile doğru sanal host'u bulamazsa varsayılan olarak ilk tanımlı SSL sanal host'una yönlendiriyor. Güvensiz sitenin 443 portu için bir VirtualHost tanımı olmadığından, bu durumda ya ilk SSL host'unun sertifikası gösteriliyor ya da bağlantı reddediliyor.

Çözüm için iki yaklaşım var:

1. En Temiz Çözüm: Catch-All VirtualHost (443)
Güvensiz siteler için 443 portunda bir "catch-all" sanal host tanımı yapmak. Bu sanal host, eşleşmeyen tüm HTTPS isteklerini yakalar ve ya HTTP'ye yönlendirir ya da bir hata sayfası gösterir.

Kod:
<VirtualHost _default_:443>
    # Bu host, diğer SSL hostlarıyla eşleşmeyen tüm HTTPS isteklerini yakalar
    ServerName catchall.localhost
    # İsteği HTTP'ye yönlendir
    Redirect permanent / http://%{HTTP_HOST}/
    
    # Veya bir hata sayfası göster
    # DocumentRoot /var/www/html/error-pages
    
    # Yine de bir SSL sertifikası gerekli (self-signed olabilir)
    SSLEngine on
    SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
    SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
</VirtualHost>

Bu yöntemde, _default_:443 kullanarak IP bazlı bir yakalama yapıyorsun. Bu sayede diğer SSL host'larını etkilemez.

2. Alternatif: NameVirtualHost ile SNI Kullanımı
Eğer tüm sitelerin aynı IP'yi kullandığı bir ortamdaysan, Apache'nin SNI desteğini aktif etmen yeterli olabilir. Modern Apache sürümlerinde (2.4) SNI varsayılan olarak açık gelir. Ancak yine de her site için 443 portunda bir VirtualHost tanımı yapman gerekir.

Kod:
# Güvensiz site için de 443 portu tanımla (aynı IP'de)
<VirtualHost *:443>
    ServerName insecure-site.com
    # Aynı SSL ayarlarını buraya kopyala veya Include ile ekle
    SSLEngine on
    SSLCertificateFile /etc/ssl/certs/insecure-selfsigned.crt
    SSLCertificateKeyFile /etc/ssl/private/insecure-selfsigned.key
    
    DocumentRoot /var/www/insecure-site
</VirtualHost>

Bu durumda self-signed sertifika kullanmak zorunda kalabilirsin ama en azından tarayıcı uyarısını geçince doğru siteye erişilir.

Ben genelde ilk yöntemi tercih ediyorum. Catch-all VirtualHost'a ek olarak ErrorDocument 403 /error-pages/no-https.html gibi bir sayfa koyup kullanıcılara "Bu site HTTPS desteklemiyor" mesajı göstermek daha temiz oluyor. Ayrıca bu sayede loglarda da hangi isteklerin geldiğini görebiliyorsun.
 
Geri
En Üst