SSL نصب کردید، آدرس سایت هم به HTTPS تغییر داد — اما مرورگر هنوز هشدار می‌دهد. قفل سبز نشان نمی‌دهد، یا یک علامت تعجب کنار آدرس می‌بینید. این احتمالاً Mixed Content است — یکی از رایج‌ترین مشکلاتی که بعد از نصب SSL گریبان صاحبان سایت را می‌گیرد.

خبر خوب: این مشکل کاملاً قابل حل است. در این راهنما توضیح می‌دهیم Mixed Content دقیقاً چیست، چرا خطرناک است، چطور پیدایش کنید، و چگونه برطرفش کنید.

Mixed Content چیست؟

Mixed Content یعنی یک صفحه‌ای که از طریق HTTPS (امن) بارگذاری می‌شود، اما بخشی از منابعش (تصاویر، اسکریپت‌ها، استایل‌ها، فونت‌ها، iframe ها) از طریق HTTP (ناامن) لود می‌شوند.

وقتی این اتفاق می‌افتد، اتصال بین کاربر و سایت «مختلط» است — بخشی رمزنگاری‌شده، بخشی باز. این مثل این است که یک در امن داشته باشید اما یک پنجره شکسته هم داشته باشید.

دو نوع Mixed Content

Passive Mixed Content

منابعی که محتوای صفحه را نمی‌توانند تغییر دهند: تصاویر، ویدیوها، فایل‌های صوتی. مرورگر معمولاً این موارد را بارگذاری می‌کند اما در نوار آدرس یک هشدار نشان می‌دهد — قفل با علامت تعجب، یا «Not Fully Secure».

Active Mixed Content

منابعی که می‌توانند محتوای صفحه را دستکاری کنند: فایل‌های JavaScript، CSS، iframe ها. این نوع بسیار خطرناک‌تر است. اگر یک فایل JS از HTTP بارگذاری شود، یک مهاجم Man-in-the-Middle می‌تواند آن فایل را در حین انتقال تغییر دهد و کد مخرب تزریق کند. به همین دلیل مرورگرهای مدرن Active Mixed Content را به‌طور کامل مسدود می‌کنند.

چرا Mixed Content مشکل جدی است؟

  • امنیت ناقص: HTTPS برای رمزنگاری طراحی شده. منابع HTTP در همان صفحه این رمزنگاری را می‌شکنند.
  • هشدار مرورگر: کاربران قفل شکسته یا «Not Secure» می‌بینند. این اعتماد را از بین می‌برد — به‌خصوص در صفحات پرداخت یا ثبت‌نام.
  • خرابی صفحه: منابع Active Mixed Content توسط مرورگر مسدود می‌شوند. اگر آن منابع JavaScript حیاتی باشند، صفحه ممکن است شکسته یا غیرقابل استفاده شود.
  • تأثیر سئو: گوگل HTTPS را به HTTP ترجیح می‌دهد. Mixed Content می‌تواند از اعتبار امنیتی سایت بکاهد.

چطور Mixed Content را پیدا کنیم؟

روش ۱: Developer Tools مرورگر

  1. صفحه مورد نظر را باز کنید.
  2. F12 را بزنید.
  3. به تب Console بروید.
  4. پیام‌هایی با متن «Mixed Content» را پیدا کنید. آدرس دقیق منبع مشکل‌دار را نشان می‌دهند.

در تب Network هم می‌توانید فیلتر کنید و منابعی که از HTTP لود می‌شوند را ببینید.

روش ۲: سرویس‌های آنلاین

سایت‌هایی مثل whynopadlock.com یا www.jitbit.com/sslcheck آدرس سایت شما را بررسی می‌کنند و لیست کاملی از منابع HTTP ارائه می‌دهند.

روش ۳: جستجو در دیتابیس وردپرس

در phpMyAdmin این کوئری SQL را اجرا کنید تا تمام پست‌هایی که آدرس HTTP دارند پیدا شوند:

SELECT ID, post_title FROM wp_posts
WHERE post_content LIKE '%http://%'
AND post_status = 'publish';

روش‌های رفع Mixed Content

روش ۱: افزونه Really Simple SSL (وردپرس)

این افزونه رایگان برای اکثر سایت‌های وردپرسی بهترین نقطه شروع است. با یک کلیک اکثر آدرس‌های HTTP داخلی را به HTTPS تبدیل می‌کند، redirect HTTP به HTTPS را تنظیم می‌کند، و هدرهای امنیتی مناسب را اعمال می‌کند.

روش ۲: Better Search Replace (وردپرس)

برای تغییر یکجا همه آدرس‌های HTTP در دیتابیس:

  1. افزونه Better Search Replace را نصب کنید.
  2. در Search، آدرس http://yourdomain.com را وارد کنید.
  3. در Replace، آدرس https://yourdomain.com را وارد کنید.
  4. همه جداول دیتابیس را انتخاب کنید.
  5. تیک «Run as dry run?» را بزنید تا ببینید چند مورد پیدا می‌شود (بدون تغییر واقعی). بعد تیک را بردارید و دوباره اجرا کنید.

روش ۳: تنظیم آدرس‌ها در wp-config.php

مطمئن شوید آدرس سایت در wp-config.php با HTTPS تنظیم شده:

define('WP_HOME','https://yourdomain.com');
define('WP_SITEURL','https://yourdomain.com');

روش ۴: Redirect در .htaccess

برای اطمینان از اینکه همه ترافیک از طریق HTTPS می‌آید، این کد را به ابتدای فایل .htaccess اضافه کنید:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

روش ۵: CSP Header برای ارتقا خودکار

با اضافه کردن این هدر به فایل .htaccess، مرورگر به‌صورت خودکار تمام منابع HTTP را به HTTPS ارتقا می‌دهد:

Header always set Content-Security-Policy "upgrade-insecure-requests"

Mixed Content در پلاگین‌ها و قالب وردپرس

یک منبع Mixed Content که اغلب نادیده گرفته می‌شود: خود قالب یا افزونه‌ها. برخی قالب‌ها و افزونه‌های قدیمی آدرس‌های CDN یا منابع خارجی را با http:// هاردکد کرده‌اند. در این موارد:

  • قالب و افزونه‌ها را به آخرین نسخه به‌روز کنید — نسخه‌های جدیدتر معمولاً این مشکلات را رفع کرده‌اند.
  • اگر قالب سفارشی دارید، در کد قالب دنبال http:// بگردید و تغییر دهید.

Mixed Content ناشی از منابع خارجی

گاهی منابع HTTP از سایت‌های خارجی وارد سایت شما می‌شوند: CDN قدیمی، ویجت‌های شبکه اجتماعی، embed های ویدیو، یا اسکریپت‌های تبلیغاتی. در این موارد:

  • بررسی کنید آیا منبع خارجی نسخه HTTPS دارد (اکثر سرویس‌های مدرن دارند).
  • آدرس embed را از http:// به https:// تغییر دهید.
  • اگر منبع خارجی اصلاً HTTPS ندارد، آن را با گزینه امن‌تری جایگزین کنید.

کدهای embed یوتیوب را بررسی کنید — نسخه‌های قدیمی ممکن است از http://www.youtube.com استفاده کنند که باید به https://www.youtube.com تغییر پیدا کند.

Mixed Content و Cloudflare: نکته مهم

اگر از Cloudflare استفاده می‌کنید، یک تنظیم مفید وجود دارد: Automatic HTTPS Rewrites. این ویژگی در بخش SSL/TLS → Edge Certificates → Always Use HTTPS قابل فعال‌سازی است و مشابه CSP header، آدرس‌های HTTP را در بارگذاری صفحه به HTTPS تبدیل می‌کند.

اما مهم است بدانید این فقط در لایه Cloudflare اتفاق می‌افتد — دیتابیس سایت شما همچنان آدرس‌های قدیمی HTTP را دارد. اگر روزی از Cloudflare خارج شوید، Mixed Content برمی‌گردد. بنابراین این تنظیم را به عنوان یک شبکه ایمنی اضافه در نظر بگیرید، نه جایگزین رفع اصلی مشکل در دیتابیس.

ترتیب صحیح برای مهاجرت به HTTPS

اگر سایت تازه‌ای دارید که می‌خواهید به HTTPS منتقل کنید، این ترتیب را رعایت کنید تا مشکل Mixed Content اصلاً پیش نیاید:

  1. ابتدا SSL را نصب کنید و اطمینان حاصل کنید فعال است
  2. در WordPress: آدرس سایت را در تنظیمات → عمومی به HTTPS تغییر دهید
  3. با Better Search Replace دیتابیس را پاک‌سازی کنید
  4. Redirect 301 از HTTP به HTTPS را در .htaccess فعال کنید
  5. در گوگل سرچ کنسول، نسخه HTTPS را به عنوان preferred domain ثبت کنید
  6. Sitemap را با آدرس‌های HTTPS به روزرسانی کنید

انجام این مراحل به ترتیب، از ایجاد یا باقی ماندن Mixed Content جلوگیری می‌کند.

چک‌لیست بعد از رفع مشکل

  • کش مرورگر را پاک کنید (Ctrl+Shift+Delete) و صفحه را در حالت Incognito باز کنید.
  • کش افزونه کش وردپرس را پاک کنید.
  • کش Cloudflare را Purge کنید (اگر استفاده می‌کنید).
  • با ابزار whynopadlock.com یا Developer Tools یک بار دیگر بررسی کنید.
  • چند صفحه مختلف سایت را — نه فقط صفحه اصلی — بررسی کنید.

سوالات متداول

بعد از رفع مشکل چرا هنوز قفل سبز نشان نمی‌دهد؟

احتمالاً کش مرورگر نسخه قدیمی صفحه را نگه داشته. با Ctrl+Shift+Delete کش مرورگر را پاک کنید، یا صفحه را در حالت Incognito باز کنید. همچنین کش Cloudflare یا افزونه کش سرور را هم Purge کنید. اگر بعد از همه این کارها هنوز هشدار بود، احتمالاً یک منبع HTTP پنهان در صفحه هست که با Developer Tools باید دقیق‌تر پیدا کنید.

آیا CSP می‌تواند همه مشکلات Mixed Content را حل کند؟

هدر upgrade-insecure-requests بسیاری از موارد را به‌صورت خودکار ارتقا می‌دهد. اما این فقط برای منابعی که آدرس‌شان HTTPS دارند کار می‌کند. اگر یک سرور فقط HTTP دارد و HTTPS ندارد، مرورگر نمی‌تواند ارتقا دهد و آن منبع مسدود می‌شود. بنابراین CSP راه‌حل تکمیلی است، نه جایگزین درست کردن آدرس‌ها در کد.

چرا بعد از نصب SSL باز هم این مشکل پیش می‌آید؟

نصب SSL گواهی امنیتی را روی سرور فعال می‌کند — اما تمام آدرس‌های موجود در دیتابیس و کد سایت را تغییر نمی‌دهد. اگر تصاویر، لینک‌ها، و اسکریپت‌ها همچنان با http:// ذخیره شده‌اند، Mixed Content باقی می‌ماند. بعد از نصب SSL، حتماً دیتابیس و آدرس‌های هاردکد شده در قالب را هم به‌روز کنید.

Mixed Content در سایت‌های غیر وردپرسی چطور رفع می‌شود؟

اصل یکی است: باید تمام آدرس‌های HTTP را در کد HTML، CSS، و JS به HTTPS تغییر دهید. در Laravel می‌توانید از asset() و url() helper که خودکار به HTTPS تبدیل می‌کنند استفاده کنید. در سایت‌های HTML ساده، باید دستی در فایل‌ها جستجو کنید. ابزارهایی مثل grep یا ویژگی Find and Replace در IDE کمک می‌کنند.

Mixed Content روی سایت چه تأثیر سئویی دارد؟

گوگل سایت‌هایی که HTTPS کامل و درست دارند را نسبت به HTTP ترجیح می‌دهد. وقتی Mixed Content دارید، از نظر فنی سایت HTTPS است اما هشدار «Not Secure» کاربران را فراری می‌دهد. نرخ پرش (bounce rate) بالاتر می‌رود که یک سیگنال منفی برای سئو است. به‌علاوه، گوگل می‌تواند منابع HTTP ناامن را در crawl خود شناسایی کند. رفع کامل Mixed Content بخشی از بهینه‌سازی فنی سئو است.

آیا Mixed Content روی موبایل هم مشکل ایجاد می‌کند؟

بله، مرورگرهای موبایل — Chrome، Firefox، و Safari روی iOS — همان قوانین Mixed Content را اجرا می‌کنند. Active Mixed Content مسدود می‌شود، Passive Mixed Content هشدار ایجاد می‌کند. از آنجا که اکثر ترافیک اینترنت امروز از موبایل است، اهمیت رفع این مشکل دو چندان می‌شود.

یک نکته اضافه: مرورگرهای موبایل گاهی این مشکلات را در نمای مخفی‌تری نشان می‌دهند و کاربران ممکن است هشدار را نبینند ولی عملاً منابع مسدود شوند. بهترین روش تست این است که سایت را در Chrome موبایل با Developer Console (از طریق Chrome Remote Debugging) بررسی کنید تا مطمئن شوید همه منابع درست لود می‌شوند.

جمع‌بندی

Mixed Content یکی از رایج‌ترین مشکلاتی است که بعد از مهاجرت به HTTPS پیش می‌آید — اما کاملاً قابل حل است. برای سایت‌های وردپرسی، افزونه Really Simple SSL در اکثر موارد کافی است. اگر مشکل عمیق‌تر بود، Better Search Replace دیتابیس را یکجا پاک‌سازی می‌کند.

وقتی مطمئن شدید هیچ منبع HTTP ای باقی نمانده، قفل سبز در نوار آدرس نشان می‌دهد که ارتباط کاربر با سایت شما کاملاً رمزنگاری‌شده است — هم برای امنیت واقعی، هم برای اعتمادی که کاربران به سایت شما دارند.