Karışık İçerik (Mixed Content) Uyarısı Nasıl Giderilir?

Sitenize SSL sertifikası kurdunuz, ama adres çubuğundaki kilit hâlâ görünmüyor ya da ünlem işaretiyle "güvenli değil" diyor. Bunun en yaygın sebebi karışık içerik (mixed content)tir: sayfanın kendisi HTTPS ile yüklenirken içindeki bazı kaynaklar hâlâ HTTP üzerinden çağrılıyordur. Bu yazıda sorunu nasıl bulup kalıcı olarak çözeceğinizi anlatıyoruz.

Karışık içerik nedir?

Güvenli bir (https://) sayfa, güvensiz (http://) bir kaynak yüklediğinde tarayıcı bunu bir güvenlik açığı sayar. İki türü vardır:

  • Pasif karışık içerik: Resim, video, ses gibi kaynaklar. Tarayıcı genelde yükler ama kilidi kaldırır ve konsola uyarı yazar.
  • Aktif karışık içerik: Script, stil dosyası (CSS), iframe, XHR/fetch çağrıları. Bunlar sayfayı ele geçirebileceği için tarayıcı tarafından engellenir ve sayfanız bozuk görünür.

Adım 1 — Suçlu kaynakları bulun

Tarayıcının geliştirici araçlarını açın (F12) ve Console sekmesine bakın. Karışık içerik uyarıları net biçimde listelenir:

Mixed Content: The page at 'https://alanadiniz.com/' was loaded over HTTPS,
but requested an insecure resource 'http://alanadiniz.com/img/logo.png'.
This content should also be served over HTTPS.

Her satır, hangi kaynağın HTTP ile yüklendiğini söyler. Bu listeyi çıkararak düzeltilecek adresleri belirleyin.

Görsel: <DevTools Console'da mixed content uyarıları>
Geliştirici araçlarının konsolu, güvensiz kaynakları tek tek listeler.

Adım 2 — Kaynak adreslerini düzeltin

En kalıcı çözüm, sayfa kaynaklarındaki http:// ön eklerini https:// yapmaktır. Mümkünse alan adı içermeyen protokol-bağımsız ya da kök-göreli yollar kullanın:

<!-- Yanlış -->
<img src="http://alanadiniz.com/img/logo.png">
<script src="http://cdn.ornek.com/lib.js"></script>

<!-- Doğru -->
<img src="https://alanadiniz.com/img/logo.png">
<img src="/img/logo.png">                  <!-- kök-göreli, en güvenlisi -->
<script src="https://cdn.ornek.com/lib.js"></script>

CSS dosyaları içindeki url(http://...) tanımlarını ve içe gömülü background-image değerlerini de unutmayın.

Adım 3 — Veritabanındaki eski adresleri toplu değiştirin

İçerik yönetim sistemlerinde (CMS) eski yazılar veritabanında http:// bağlantılarıyla dolu olabilir. Bunları toplu güncellemek için bir veritabanı sorgusu kullanabilirsiniz. Önce mutlaka yedek alın, sonra şuna benzer bir güncelleme çalıştırın:

-- Önce YEDEK alın!
UPDATE icerikler
SET govde = REPLACE(govde, 'http://alanadiniz.com', 'https://alanadiniz.com');

Tablo ve sütun adlarını kendi şemanıza göre uyarlayın.

Adım 4 — Toplu çözüm: upgrade-insecure-requests

Yüzlerce eski bağlantıyı tek tek düzeltmek zorsa, tarayıcıya tüm HTTP isteklerini otomatik olarak HTTPS'e yükseltmesini söyleyen bir güvenlik başlığı ekleyebilirsiniz. Bu, aynı kaynağın HTTPS sürümü mevcutsa işe yarar:

# Nginx
add_header Content-Security-Policy "upgrade-insecure-requests";
<!-- veya HTML <head> içinde -->
<meta http-equiv="Content-Security-Policy"
      content="upgrade-insecure-requests">

Bu yöntem, dış sunucuda HTTPS sürümü olmayan kaynaklar için çözüm değildir; o tür kaynakları ya HTTPS sunan bir alternatifle değiştirin ya da kendi sunucunuza taşıyın.

Adım 5 — Önbelleği temizleyip doğrulayın

Değişikliklerden sonra tarayıcı ve varsa CDN önbelleğini temizleyin, ardından sayfayı özel sekmede açıp F12 → Console'da artık uyarı kalmadığını teyit edin. Kilit simgesi geri geldiyse sorun çözülmüştür.

Sık karşılaşılan tuzaklar

  • Sabit kodlanmış (hardcoded) adresler: Tema ve eklenti dosyalarında gömülü http:// bağlantıları.
  • Dış reklam/analitik script'leri: HTTPS desteklemeyen üçüncü taraf kaynakları kaldırın veya güncelleyin.
  • Eski sosyal medya gömme kodları: Yeni, HTTPS uyumlu gömme kodlarıyla değiştirin.

Özet

Karışık içerik, HTTPS sayfada kalan HTTP kaynaklarından doğar ve kilidi düşürür. Konsoldan suçluları bulun, adresleri https:// yapın, gerekirse upgrade-insecure-requests ile destekleyin. Sertifikanız henüz yoksa veya yenilemeniz gerekiyorsa ücretsiz SSL sihirbazımızla oluşturup ZIP paketini indirin.