SSL sertifikanızı kurdunuz, sitenizin adresi artık https:// ile başlıyor ama tarayıcının adres çubuğundaki güvenli kilit simgesi bir türlü tam yeşil olmuyor. Konsolu açtığınızda ise sarı ünlem işaretleri ve uyarılarla karşılaşıyorsunuz. Bu klasik tablonun arkasında neredeyse her zaman aynı sebep yatar: sayfanız HTTPS üzerinden yüklenirken içindeki bazı kaynaklar hâlâ HTTP üzerinden çağrılıyor.
Mixed Content Tam Olarak Nedir?
Bir sayfa HTTPS ile sunulduğunda, tarayıcı o sayfanın yüklediği tüm alt kaynakların (görsel, stil dosyası, JavaScript, font, iframe) da şifreli kanaldan gelmesini bekler. Eğer sayfanın kendisi güvenliyken içindeki bir görsel http:// ile çağrılıyorsa, tarayıcı bu durumu "karışık içerik" olarak işaretler. Çünkü şifreli bir sayfanın ortasına şifresiz bir veri akışı sızmış olur ve bu, sayfanın bütünlük garantisini zedeler.
Karışık içerik iki ana sınıfta incelenir ve tarayıcıların bunlara tepkisi birbirinden epeyce farklıdır.
Pasif ve Aktif Karışık İçerik Ayrımı
Bu ayrımı anlamak, sorunun ne kadar acil olduğunu kestirmenize yardımcı olur. Pasif (passive) karışık içerik görsel, video ve ses gibi sayfa üzerinde DOM'u doğrudan değiştiremeyen kaynaklardır. Aktif (active) karışık içerik ise script, CSS, XMLHttpRequest ve iframe gibi sayfanın davranışını ele geçirebilecek kaynaklardır.
| Tür | Örnek Kaynaklar | Tarayıcı Davranışı | Risk Düzeyi |
|---|---|---|---|
| Pasif | img, audio, video | Genellikle yüklenir, kilit kırılır, konsola uyarı düşer | Orta |
| Aktif | script, link (CSS), iframe, fetch/XHR | Çoğu modern tarayıcıda doğrudan engellenir | Yüksek |
Yani sitenizdeki bir tema dosyası HTTP üzerinden çağrılıyorsa, ziyaretçi büyük ihtimalle bozuk bir tasarımla karşılaşır; çünkü Chrome ve Firefox bu CSS'i çoğu durumda hiç yüklemez. Pasif içerikte ise sayfa görünürde çalışmaya devam eder, fakat adres çubuğundaki kilit "bu sitede güvenli olmayan içerik var" uyarısına dönüşür. Arama motorları açısından da bu durum istenmeyen bir sinyaldir; çünkü tam HTTPS güvencesi veremeyen bir sayfa, güven gerektiren işlemlerde geri planda kalabilir.
WordPress'te En Sık Görülen Nedenler
Sorunun kaynağı neredeyse her zaman veritabanında ya da tema kodunda gömülü kalmış eski HTTP adresleridir. Pratikte şu noktalar öne çıkar:
- Sabit kodlanmış URL'ler: Yazı içeriğine elle eklenmiş,
http://ile başlayan görsel veya bağlantı adresleri. - Tema ve eklenti varlıkları:
wp_enqueue_scriptya dawp_enqueue_styleçağrılarında protokolü sabitlenmiş kaynaklar. - Site Address ayarları: Ayarlar > Genel altındaki WordPress Adresi ve Site Adresi alanlarının hâlâ HTTP olarak kalması.
- Harici servisler: HTTP üzerinden çekilen reklam kodları, eski CDN bağlantıları veya gömülü harita/video içerikleri.
- Veritabanı kalıntıları:
wp_postmetavewp_optionsiçine serileştirilmiş (serialized) hâlde yazılmış eski adresler.
Sorunu Teşhis Etmek
Önce hangi kaynağın suçlu olduğunu net biçimde görmeniz gerekir. Tarayıcı geliştirici araçlarını (F12) açıp Console sekmesine bakın; "Mixed Content: The page at ... was loaded over HTTPS, but requested an insecure ..." şeklindeki satırlar size tam olarak hangi URL'in sorun çıkardığını söyler. Sunucu tarafında ise içeriği tarayarak da arama yapabilirsiniz:
wp search-replace 'http://siteadiniz.com' 'https://siteadiniz.com' \
--all-tables --dry-run
# Hangi tablolarda kaç değişiklik olacağını gösterir, gerçek değişiklik yapmazWP-CLI'nin search-replace komutu, serileştirilmiş verileri bozmadan güncellediği için elle SQL sorgusu çalıştırmaya kıyasla çok daha güvenlidir. --dry-run ile önce ön izleme almanızı öneririm. Komut satırına erişiminiz yoksa, Better Search Replace gibi serialize uyumlu bir eklenti aynı işi panel üzerinden yapar; ancak elle UPDATE wp_posts SET post_content = REPLACE(...) türü ham SQL sorgularından uzak durun, çünkü bunlar serileştirilmiş dizilerdeki karakter uzunluğu bilgisini bozarak veriyi okunamaz hâle getirebilir.
Kalıcı Çözüm: Adresleri Toplu Güncelleme
Teşhisten emin olduktan sonra aynı komutu --dry-run olmadan çalıştırarak değişikliği uygulayabilirsiniz:
# Veritabanı yedeği aldıktan SONRA çalıştırın
wp db export yedek-$(date +%F).sql
wp search-replace 'http://siteadiniz.com' 'https://siteadiniz.com' \
--all-tables --skip-columns=guidguid sütununu atlamak önemlidir; bu alan RSS okuyucuları için kalıcı bir kimlik görevi gördüğünden değiştirmek beslemelerde tekrar bildirimlerine yol açabilir. İşlemden önce mutlaka tam bir yedek alın. Sağlam ve güncel bir SSL altyapısı için Bogahost SSL sertifikaları üzerinden doğru zincire sahip bir sertifika kullandığınızdan emin olun; eksik ara sertifika da kilit sorununu tetikleyebilir.
Sunucu Tarafında Yönlendirme ve Başlıklar
Veritabanını temizledikten sonra, gelen tüm HTTP isteklerini HTTPS'e yönlendirmek ve tarayıcıya "bu siteyi yalnızca HTTPS ile aç" demek isteriz. Apache/LiteSpeed ortamında .htaccess dosyasına şunu ekleyebilirsiniz:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
</IfModule>
Header always set Content-Security-Policy "upgrade-insecure-requests"Buradaki upgrade-insecure-requests direktifi pratik bir kurtarıcıdır: tarayıcıya, sayfadaki HTTP kaynak isteklerini engellemeden önce sessizce HTTPS'e yükseltmesini söyler. Bu, kaynağı bulunamayan eski bir görsel için geçici bir tampon işlevi görür ama asıl temizliğin yerini tutmaz.
Tema ve Eklenti Kaynaklı Sorunlar
Eğer adresleri güncellemenize rağmen belirli bir dosya ısrarla HTTP üzerinden çağrılıyorsa, sorun kod içindedir. Tema veya eklenti dosyalarında protokolü sabitlenmiş çağrıları arayın. Doğrusu, protokolü hiç belirtmeden WordPress'in kendi fonksiyonlarına bırakmaktır:
// Yanlış: protokol sabitlenmiş
wp_enqueue_style( 'ana-stil', 'http://siteadiniz.com/style.css' );
// Doğru: WordPress doğru protokolü kendi üretir
wp_enqueue_style( 'ana-stil', get_stylesheet_uri() );Yönetilen bir WordPress hosting ortamında genellikle SSL zorlaması ve yönlendirmeler hazır gelir, böylece bu ayarların çoğuyla tek tek uğraşmanız gerekmez.
Bogahost Önerisi: Veritabanında toplu değişiklik yapmadan önce mutlaka
wp db exportile yedek alın ve değişiklikleri önce bir staging (deneme) kopyası üzerinde deneyin. Serileştirilmiş veriyi elle düzenlemek yerine her zaman WP-CLI veya Better Search Replace gibi serialize uyumlu araçları tercih edin.Doğrulama ve Bakım
Temizlik sonrası işin bittiğine emin olmak için birkaç noktayı kontrol edin. Tarayıcı konsolunda hiçbir mixed content uyarısı kalmamalı. Why No Padlock benzeri çevrimiçi tarayıcılar veya
curl -sI https://siteadiniz.comçıktısı, başlıkların ve yönlendirmenin doğru çalıştığını gösterir. Yeni içerik eklerken görselleri Medya Kütüphanesi üzerinden yüklemek, elle HTTP adresi girme riskini büyük ölçüde ortadan kaldırır.Özetle
Karışık içerik, kötü niyetli bir hatadan çok, SSL geçişinin yarım kalmış bir kalıntısıdır. Veritabanındaki eski adresleri serialize uyumlu bir araçla güncellemek, sunucuda kalıcı 301 yönlendirmesi kurmak ve tema kodundaki sabit protokolleri ayıklamak çoğu durumda sorunu kökünden çözer. Bir kez düzgün kurduğunuzda kilit simgeniz kapanır ve hem ziyaretçi güveni hem de arama motoru görünürlüğü adına sağlam bir zemine oturursunuz.
Reklam Alanı
İçerik Altı (728x90)
Yorumlar (0)
Henüz yorum yapılmamış. İlk yorumu siz yapın!
Yorum Yap