Karma İçerik Hatası: SSL Var Ama Kilit Simgesi Görünmüyor
Sertifikayı kurdunuz, site https:// ile açılıyor, ama Chrome’un adres çubuğunda kilit yerine “Güvenli değil” yazıyor. Ya da kilit var, üzerinde küçük bir uyarı işareti duruyor. Sertifikada bir sorun yok; sayfanın içinde hâlâ http:// ile çağrılan dosyalar var. Tarayıcı buna karma içerik (mixed content) diyor.
Karma içerik ikiye ayrılır. Pasif karma içerik görsel, video ve ses gibi sayfanın kodunu değiştiremeyen kaynaklardır; tarayıcı bunları yükler ama kilit simgesini düşürür. Aktif karma içerik CSS, JavaScript, iframe ve fetch/XHR istekleridir; Chrome, Firefox ve Edge bunları yıllardır sessizce engelliyor. Bu yüzden bazı sitelerde yalnızca kilit kaybolur, bazılarında slider dönmez, iletişim formu gönderilmez, sayfa yarı tasarımsız görünür.
İyi haber şu: sorun neredeyse hiçbir zaman sertifikada değil, içerikte. Aşağıda önce hatanın tam olarak nerede olduğunu bulacak, sonra veritabanı ve tema tarafında kalıcı olarak temizleyeceğiz.
Hatayı tarayıcı konsolunda bulmak
Tahmin yürütmeyin, listeyi tarayıcıdan alın. Sorunlu sayfayı açın ve F12 ile geliştirici araçlarını açın.
- Console sekmesine geçin ve sayfayı
Ctrl+F5ile yenileyin. - Şu iki mesajı arayın:
Mixed Content: The page at 'https://alanadi.com/' was loaded over HTTPS, but requested an insecure image...ve engellenenler için...was blockedile biten satır. - Her satırın sonunda yüklenmeye çalışılan tam URL yazar. Bu adresleri bir metin dosyasına kopyalayın; düzeltilecek listeniz odur.
- Network sekmesinde filtre kutusuna
http://yazarak da aynı listeyi çıkarabilirsiniz.
Tek tek sayfa gezmek istemiyorsanız whynopadlock.com gibi bir tarayıcı aracına site adresinizi verin; sayfadaki tüm güvensiz kaynakları tek ekranda listeler. İç sayfalarda da sorun olabileceği için anasayfa, bir ürün veya yazı sayfası ve iletişim sayfasını ayrı ayrı kontrol edin.
Hangi kaynak neye yol açar
| Kaynak türü | HTML etiketi | Tarayıcı davranışı |
|---|---|---|
| Görsel | <img src="http://..."> |
Yüklenir, kilit düşer |
| Stil dosyası | <link href="http://..."> |
Engellenir, tasarım bozulur |
| JavaScript | <script src="http://..."> |
Engellenir, slider ve form çalışmaz |
| iframe | <iframe src="http://..."> |
Engellenir, harita veya video boş kalır |
| Yazı tipi | @font-face url(http://...) |
Engellenir, yedek font görünür |
| Form hedefi | <form action="http://..."> |
Gönderimde uyarı çıkar |
En sık karşılaşılan üç kaynak: yıllar önce içeriğe elle yapıştırılmış görsel adresleri, eski Google Fonts veya jQuery CDN bağlantıları ve http:// ile gömülmüş YouTube ya da Google Haritalar iframe kodları.
Veritabanında toplu http→https değişimi
WordPress, OpenCart veya benzeri bir sistemde adresler içerik tablolarının içine gömülüdür. Elle düzeltmek gerçekçi değildir; toplu değişim gerekir. Önce tam yedek alın — cPanel’de JetBackup ya da phpMyAdmin üzerinden Dışa Aktar yeterlidir.
Önemli uyarı: phpMyAdmin’de düz UPDATE wp_posts SET post_content = REPLACE(...) çalıştırmayın. WordPress’in eklenti ve tema ayarları serileştirilmiş (serialized) dizi olarak saklanır ve bu dizilerde her metnin karakter uzunluğu da yazılıdır: s:27:"http://alanadi.com/logo.png". Metni kısaltıp uzunluk sayısını güncellemeyen bir SQL sorgusu bu kaydı bozar; sonuçta widget ayarları, slider içerikleri ve tema seçenekleri silinmiş görünür.
Doğru yöntemler:
- WP-CLI (SSH erişiminiz varsa en güvenlisi): önce
wp search-replace 'http://alanadi.com' 'https://alanadi.com' --all-tables --precise --dry-runile deneme yapın; çıkan sayılar mantıklıysa--dry-runolmadan tekrar çalıştırın. - Better Search Replace eklentisi: Araçlar menüsünden, önce “Kuru çalıştırma” seçeneği işaretliyken deneyin. Serileştirilmiş veriyi doğru işler.
- Protokolü tamamen atıp
//alanadi.com/biçimine geçmeyin; bu eski yöntem artık gereksiz. Doğrudanhttps://yazın.
Değişimden sonra WordPress’te Ayarlar > Genel altındaki “WordPress Adresi” ve “Site Adresi” alanlarının da https ile başladığını doğrulayın. Bu alanlar wp-config.php içinde WP_HOME ve WP_SITEURL ile sabitlenmişse değişimi orada yapmanız gerekir.
Tema, eklenti ve sabit kodlanmış bağlantılar
Veritabanını temizledikten sonra hâlâ uyarı alıyorsanız kaynak tema veya eklenti dosyalarındadır. SSH ile şu komut sorunlu satırları doğrudan gösterir:
grep -rn "http://" wp-content/themes/temaadi/ --include=*.php --include=*.css --include=*.js
Bulduklarınızın hepsi sorun değildir; yalnızca tarayıcıya yüklenen kaynaklar önemlidir. Çıkan sonuçlarda üç kalıbı arayın: src=, href= ve CSS içindeki url(. Tema dosyasını düzenliyorsanız mutlaka alt tema (child theme) kullanın, yoksa ilk güncellemede değişiklik silinir.
Sık görülen özel durumlar:
- Sayfa oluşturucuların ürettiği dosyalar: Elementor’da Elementor > Araçlar > Dosyaları Yeniden Oluştur ile CSS yeniden üretilmelidir, yoksa eski http adresleri diskte kalır.
- LiteSpeed Cache veya WP Rocket gibi eklentilerin birleştirilmiş CSS/JS dosyaları: önbelleği tamamen temizleyin.
- Reklam, canlı destek ve analiz kodları: sağlayıcının yıllar önce verdiği kod parçası hâlâ http olabilir; güncel sürümü panelinden yeniden alın.
- Yorum avatarları, eski favicon tanımları ve RSS’e gömülü logo adresleri.
Son çare: upgrade-insecure-requests
Kaynağına ulaşamadığınız birkaç bağlantı kalıyorsa tarayıcıya “bu sayfadaki tüm http isteklerini https’e çevirerek dene” diyebilirsiniz. Apache veya LiteSpeed çalıştıran bir paylaşımlı hosting hesabında .htaccess dosyasına şu satırı ekleyin:
Header always set Content-Security-Policy "upgrade-insecure-requests"
Sunucu başlığı ekleyemiyorsanız tema şablonunuzun <head> bölümüne aynı etkiyi veren meta etiketini koyabilirsiniz: <meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">
Bunun sınırını bilin: kaynak sunucu gerçekten https destekliyorsa istek başarılı olur, desteklemiyorsa dosya yine yüklenmez. Yani bu bir yama, temizliğin yerine geçmez. Ayrıca <form action> hedeflerini kapsamaz.
Site geneline gelen http isteklerini de https’e taşımayı unutmayın; doğru yapılandırmasını http’den https’e yönlendirme yazısında adım adım anlattık. Sertifikanın kendisi ve çalışma mantığı için SSL sertifikası nedir yazısına bakabilirsiniz.
Düzeltmeyi doğrulama
İşlem bittikten sonra şu sırayla kontrol edin:
- Tüm önbellekleri temizleyin: eklenti önbelleği, varsa sunucu tarafı LiteSpeed önbelleği ve CDN önbelleği.
- Tarayıcıda gizli sekme açın; normal sekme eski dosyaları diskten okuyup sizi yanıltabilir.
- Anasayfa dışında en az üç iç sayfayı konsol açıkken gezin.
- Mobil görünümü de deneyin; bazı temalar mobilde farklı görsel yükler.
- Arama motoru tarafında Search Console’da “URL Denetimi” ile https sürümün taranabildiğini doğrulayın.
Kilit geri geldiğinde iş bitmiş demektir. Sonradan içerik eklerken görsel adreslerini elle yapıştırmayın; medya kütüphanesinden ekleyin, böylece adres her zaman site adresinizle uyumlu üretilir. Yeni bir eklenti kurduğunuzda da ilk kontrol konsolda karma içerik uyarısı olup olmadığıdır.
Özetle
- Kilit görünmüyorsa sertifika değil, sayfa içindeki
http://kaynakları suçludur. - Listeyi tahminle değil,
F12 > ConsoleveNetworksekmesinden çıkarın. - Veritabanında düz SQL
REPLACEkullanmayın; serileştirilmiş veri bozulur. WP-CLIsearch-replaceya da Better Search Replace kullanın. - Kalan sabit bağlantılar için tema ve eklenti dosyalarında
grepyapın, değişiklikleri alt temada tutun. upgrade-insecure-requestsbaşlığı son çaredir; kaynak https desteklemiyorsa kurtarmaz.