Mixed Content באתר HTTPS: זיהוי וטיפול בקישורים לא מוצפנים

דף HTTPS שטוען משאב HTTP מסומן כ'לא מאובטח' ופוגע בחוויית המשתמש וב-SEO. מדריך לאיתור ותיקון.

Mixed Content הוא מצב שבו דף שנטען על HTTPS מבקש משאב (CSS, JS, תמונה, פונט, video) דרך HTTP. דפדפנים מסמנים את הדף כ'לא מאובטח', חוסמים אוטומטית JS מעורב (active mixed content), ופוגעים בחוויית המשתמש בצורה משמעותית.

למה זה משנה

השפעות mixed content מתחלקות לשלושה תחומים: אבטחה - תוקף שיכול לתפוס תעבורת HTTP יכול להחליף את המשאב לפני שיגיע למבקר. אם זה JavaScript, הוא יכול להזריק קוד שגונב cookies; אם זה תמונה, הוא יכול להחליף בתמונה אחרת. דפדפנים חוסמים אוטומטית active mixed content (script, iframe, fetch) - מה שאומר שאתר עם רכיבי JS מעורבים פשוט לא יעבוד. חוויית משתמש - איקון המנעול הופך לאזור צהוב או 'Not Fully Secure' עם אזהרה. ב-Chrome, יש מצב שבו המבקר רואה אזהרת 'This site is not secure' לפני התוכן. SEO - Google מתייחס לזה ככשלון אבטחה ומוריד נקודות איכות. הבעיה נפוצה במיוחד אחרי מעבר לתעודת SSL: הדומיין החדש מתחיל ב-https אבל קישורים ישנים בתוכן (תמונות בפוסטים, קישורי תפריט, hardcoded URLs בתבנית) עדיין מצביעים ל-http.

איך לזהות

הבדיקה סורקת דפים מרכזיים באתר ומחפשת תגי src, href, action שמתחילים ב-http://. ידנית: פתח את האתר ב-Chrome > F12 > Console. אזהרות 'Mixed Content: The page at https://... was loaded over HTTPS, but requested an insecure...' מצביעות על הבעיה. בקליטה ידנית בקוד:

curl -s https://example.com | grep -E 'src="http://|href="http://'
אתר 'Why No Padlock?' (whynopadlock.com) סורק אוטומטית.

איך לתקן

  1. בעמוד הגדרות > כללי, ודא ש-WordPress Address ו-Site Address שניהם https.
  2. התקן את התוסף 'Better Search Replace' (חינמי).
  3. בעמוד התוסף: search='http://yoursite.com', replace='https://yoursite.com'. בחר את כל הטבלאות. סמן 'Run as dry run' קודם כדי לראות כמה החלפות יבוצעו.
  4. אם המספר נראה סביר (אלפים, לא מיליונים), הסר את ה-dry run והרץ אמיתי.
  5. אחר כך, הרץ שוב חיפוש כללי על http:// (בלי הדומיין שלך) - זה יחפש קישורים לאתרים אחרים שעדיין על http. אם נמצאו, החלף ידנית - אבל בזהירות, כי לא כל אתר חיצוני זמין על https.
  6. תיקון מהיר חלופי: הוסף ב-.htaccess:
    <IfModule mod_headers.c>
        Header always set Content-Security-Policy "upgrade-insecure-requests;"
    </IfModule>
    זה אומר לדפדפן לשדרג אוטומטית כל בקשת http לdrops התואם https. פתרון 'מצמיד פלסטר' אבל יעיל לרוב המקרים.
  7. בדוק את האתר בכמה דפים. F12 > Console - אזהרות 'Mixed Content' אמורות להיעלם.
  8. אחרי הפעולה, הסר את התוסף 'Better Search Replace' - הוא לא צריך להישאר פעיל.

טעויות נפוצות

אל תכלול את עמודת guid ב-search-replace - השדה הזה משמש כ-identifier יחיד ב-RSS feeds, ושינויו ישבר feeds ויצור פוסטים כפולים אצל מנויים. אל תהריץ search-replace רגיל ב-MySQL (UPDATE ... SET) - הוא לא מטפל ב-serialized data, ואופציות שמורות בפורמט serialized יישברו. אל תניח שהבעיה רק ב-DB - חלק מה-mixed content מגיע מקבצי תבנית או תוסף עם hardcoded http://. צריך גם לחפש שם. אל תפעיל upgrade-insecure-requests בתור 'הפתרון היחיד' - זה לא פותר קישורים שמשתמש לוחץ עליהם, רק משאבים שהדפדפן מבקש אוטומטית.

בדיקה לאחר תיקון

פתח את האתר ב-Chrome במצב גלישה פרטית > F12 > Console. רענן 5-10 דפים שונים. אסור שיהיו אזהרות 'Mixed Content'. בדוק ב-whynopadlock.com - אמור להציג 'no insecure resources'. שורת הכתובת אמורה להציג מנעול ירוק מלא ללא איקון אזהרה.

טיפ: אם אחרי search-replace מוצלח עדיין יש mixed content, הסיבה הסבירה היא תבנית שמכילה הפניות hardcoded ב-HTML או PHP. חפש בקבצי התבנית:
grep -rn 'http://yoursite' wp-content/themes/your-theme/
והחלף ידנית.