כדי לכפות HTTPS בוורדפרס על שרת Apache או LiteSpeed, הוסיפו חוק הפניה 301 לקובץ .htaccess. כך כל בקשת HTTP תופנה לאותה כתובת בדיוק ב-HTTPS, והגולשים (וגם מנועי החיפוש) יראו רק גרסה אחת של כל עמוד.
התקינו קודם את תעודת ה-SSL וודאו שגרסת ה-HTTPS נטענת ללא שגיאות. לתהליך המעבר המלא, כולל טיפול בתוכן מעורב (Mixed Content), הציצו במדריך להעברת אתר וורדפרס ל-HTTPS.
הקוד לכפיית HTTPS בקובץ .htaccess
פתחו את קובץ ה-.htaccess שבתיקייה הראשית של וורדפרס (התיקייה שבה נמצא הקובץ wp-config.php) והוסיפו את השורות הבאות בתחילת הקובץ, מעל הבלוק # BEGIN WordPress:
# Force HTTPS
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# BEGIN WordPress
# (the rules WordPress generated stay here, unchanged)
# END WordPress
השאירו את הקוד מחוץ לסימונים של וורדפרס. וורדפרס כותבת מחדש את כל מה שנמצא ביניהם בכל פעם ששומרים את הקישורים הקבועים.
כיצד הקוד עובד
כך עובד כל חלק:
RewriteCond %{HTTPS} off תופס בקשות שלא הגיעו דרך SSL/TLS. שרת Apache מגדיר את HTTPS כ-on עבור חיבורים מוצפנים.
RewriteRule ^(.*)$ תופס כל נתיב ומפנה אותו ל-https:// יחד עם הדומיין והנתיב שהתבקשו. ה-Query String מועבר אוטומטית.
R=301 הופך את ההפניה לקבועה, וכך מנועי החיפוש יודעים לאנדקס את כתובת ה-HTTPS. ללא קוד סטטוס, Apache שולח הפניה זמנית מסוג 302. הדגל L עוצר את שאר החוקים עבור אותה בקשה.
החוק חייב לרוץ לפני הבלוק של וורדפרס. החוקים של וורדפרס מנתבים את רוב הבקשות ל-index.php, והפניה שממוקמת אחריהם לא תופעל עבור כתובות רגילות של פוסטים ועמודים.
שימו לב שדפדפנים שומרים הפניות 301 ב-cache לאורך זמן. בזמן הבדיקות השתמשו ב-R=302, בדקו כמה כתובות, ורק אז החליפו ל-R=301.
עדכון כתובות וורדפרס ל-HTTPS
וורדפרס עדיין בונה את הקישורים לפי ההגדרות שלה. היכנסו להגדרות > כללי ושנו גם את הכתובת של וורדפרס וגם את הכתובת של האתר ל-https://.
אם השדות האלה אפורים (כלומר לא ניתנים לעריכה), הערכים מוגדרים בקובץ wp-config.php. עדכנו אותם שם:
define( 'WP_HOME', 'https://example.com' );
define( 'WP_SITEURL', 'https://example.com' );
קישורי http:// ישנים בתוכן הפוסטים גורמים לאזהרות על תוכן מעורב. עם WP-CLI תוכלו להחליף אותם במסד הנתונים (גבו קודם, והסירו את --dry-run כשהדו"ח נראה תקין):
wp search-replace 'http://example.com' 'https://example.com' --skip-columns=guid --dry-run
אם תרצו לקבע גם גרסה אחת של הדומיין, הוסיפו את החוקים להפניה מ-www לכתובת ללא www (או להיפך).
לולאת הפניות מאחורי Cloudflare, Proxy או Load Balancer
כאשר ה-SSL מסתיים ב-Proxy או ב-Load Balancer, אותו Proxy מתקשר עם השרת שלכם ב-HTTP רגיל. במצב כזה %{HTTPS} תמיד off, כל בקשה מופנית שוב, והדפדפן מציג את השגיאה ״too many redirects״.
במקום %{HTTPS}, בדקו את ה-header בשם X-Forwarded-Proto שה-Proxy שולח:
# Force HTTPS behind a proxy that sets X-Forwarded-Proto
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
הסתמכו על ה-header הזה רק כאשר ה-Proxy בשליטתכם והוא דורס את ה-header בכל בקשה. התיעוד של Apache על כפיית HTTPS מתאר את התצורה הזו ואת ההסתייגות לגביה.
וורדפרס צריכה לדעת גם שהבקשה המקורית הגיעה ב-HTTPS. הוסיפו את הקוד הבא ל-wp-config.php, מעל השורה ״That's all, stop editing!״:
if ( isset( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) && strpos( $_SERVER['HTTP_X_FORWARDED_PROTO'], 'https' ) !== false ) {
$_SERVER['HTTPS'] = 'on';
}
ב-Cloudflare, הסיבה הנפוצה היא מצב ה-SSL/TLS בשם Flexible, שבו Cloudflare מתחבר לשרת שלכם ב-HTTP. הגדירו את המצב ל-Full (strict) עם תעודה תקפה על השרת, כפי שמתואר במדריך פתרון לולאות ההפניה של Cloudflare.
שרת Nginx אינו קורא את .htaccess
שרתי Nginx מתעלמים מקבצי .htaccess, כך שהקוד שלמעלה לא יעשה דבר. הוסיפו בלוק server שמאזין לפורט 80 ומפנה ל-HTTPS:
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
אין לכם גישה להגדרות השרת? בקשו מחברת האחסון להוסיף את ההפניה.
שאלות נפוצות
הנה כמה שאלות שעולות לא מעט לגבי כפיית HTTPS בוורדפרס:
היכן בקובץ .htaccess צריך למקם את חוק כפיית ה-HTTPS?
בראש הקובץ, מעל # BEGIN WordPress. אם תמקמו אותו אחרי החוקים של וורדפרס הוא לא ירוץ עבור כתובות של פוסטים ועמודים, ואם תמקמו אותו בתוך סימוני וורדפרס הוא יימחק כשהקישורים הקבועים יישמרו.
מדוע מופיעה השגיאה ״too many redirects״ אחרי כפיית HTTPS?
בדרך כלל ה-SSL מסתיים ב-Proxy כמו Cloudflare, כך שהשרת שלכם רואה כל בקשה כ-HTTP וממשיך להפנות. בדקו את X-Forwarded-Proto במקום %{HTTPS}, וב-Cloudflare שנו את מצב ה-SSL/TLS מ-Flexible ל-Full (strict).
האם הפניית ה-HTTPS צריכה להיות 301 או 302?
באתר החי השתמשו ב-301, מכיוון שהמעבר ל-HTTPS הוא קבוע ומנועי החיפוש צריכים לאנדקס את כתובות ה-HTTPS. בזמן בדיקות השתמשו ב-302, מכיוון שדפדפנים שומרים הפניות 301 ב-cache.
האם ההפניה ב-.htaccess פותרת אזהרות תוכן מעורב (Mixed Content)?
לא. תוכן מעורב נובע מכתובות http:// בתוך העמודים עצמם, למשל תמונות בתוכן הפוסטים. עדכנו את הכתובת של וורדפרס ואת הכתובת של האתר ל-HTTPS, והחליפו את הכתובות הישנות במסד הנתונים.