קובץ .htaccess הוא אחד הקבצים הכי חזקים באתר וורדפרס, ואחד הכי פחות מוכרים. רוב בעלי האתרים לא יודעים שהוא קיים, ומי שכן יודע נוגע בו בדרך כלל רק כשמשהו נשבר. אבל שורה אחת נכונה ב-htaccess יכולה לחסום התקפה לפני שהיא מגיעה לוורדפרס, ושורה אחת שגויה יכולה להפיל את כל האתר תוך שנייה.
במדריך הזה אני מפרט את 17 כללי ה-htaccess שאני עובר עליהם בכל אתר וורדפרס שאני מקים או מקבל לתחזוקה: הפניות, אבטחה, ביצועים וחיסכון במשאבים. כל כלל מגיע עם קוד מוכן להעתקה בתחביר של Apache 2.4, הסבר מתי הוא נחוץ ומתי עדיף לוותר עליו, ובסוף גם הקובץ המלא, רשימת בדיקות אחרי שינוי והטעויות שראיתי מפילות אתרים.
מה זה קובץ htaccess?
קובץ htaccess (קיצור של Hypertext Access) הוא קובץ הגדרות טקסט שיושב בתיקיות האתר ומאפשר לשנות את התנהגות שרת Apache או LiteSpeed ברמת התיקייה, בלי גישה להגדרות הראשיות של השרת. בוורדפרס הוא אחראי לכתובות הקבועות (Permalinks), ואפשר להוסיף בו כללי הפניה, אבטחה, דחיסה ומטמון.
הקובץ מתחיל בנקודה, ולכן הוא נחשב קובץ נסתר ברוב מנהלי הקבצים. הוא חל על התיקייה שבה הוא נמצא ועל כל תתי התיקיות שלה, ולכן הקובץ בתיקייה הראשית של האתר משפיע על כל האתר.
1. איך htaccess עובד ולמה הוא חזק כל כך
1.1 htaccess רץ לפני שוורדפרס מתחיל
כל בקשה שמגיעה לשרת עוברת קודם דרך כללי השרת, ורק אחר כך, אם צריך, השרת מפעיל את PHP ואת וורדפרס. כלומר, אם אני חוסם בוט או קובץ ב-htaccess, הבקשה נעצרת ברמת השרת, ווורדפרס לא נטען בכלל. זה חוסך משאבים, וזו גם הסיבה שהגנה ב-htaccess חזקה יותר מהגנה של תוסף, שרץ רק אחרי שוורדפרס כבר עלה.
הצד השני של אותו מטבע: שגיאת תחביר אחת בקובץ מחזירה שגיאת 500 על כל האתר, כולל ממשק הניהול. לכן הכלל הראשון הוא תמיד גיבוי, ועליו אני מרחיב בסעיף 2.3.
1.2 באילו שרתים קובץ htaccess עובד
| סוג שרת | האם קורא htaccess | הערה |
|---|---|---|
| Apache | כן | בתנאי שהגדרת AllowOverride מאפשרת זאת. ברוב האחסונים המשותפים זה פתוח. |
| LiteSpeed | כן | תואם לרוב ההוראות של Apache. נפוץ מאוד באחסון וורדפרס. |
| Nginx | לא | ההגדרות נכתבות בקובץ התצורה של השרת, ובדרך כלל רק חברת האחסון יכולה לשנות אותן. |
אם האתר שלכם רץ על Nginx, הקובץ יכול להיות קיים בתיקייה ועדיין לא להשפיע על כלום. לפני שמשקיעים בכללים, שווה לשאול את חברת האחסון על איזה שרת האתר רץ.
2. איפה נמצא קובץ htaccess ואיך עורכים אותו בבטחה
2.1 איך מוצאים את קובץ htaccess
הקובץ יושב בתיקייה הראשית של האתר, לצד wp-config.php ותיקיות wp-admin ו-wp-content. בדרך כלל זו התיקייה public_html או www, תלוי בחברת האחסון. במנהל הקבצים צריך להפעיל הצגת קבצים נסתרים (Show Hidden Files) כדי לראות אותו.
אם הקובץ לא קיים בכלל, נכנסים בוורדפרס להגדרות ואז לקישורים קבועים ולוחצים שמירה בלי לשנות כלום. וורדפרס ינסה ליצור את הקובץ עם הבלוק הבסיסי שלו, בתנאי שיש לו הרשאת כתיבה לתיקייה.
2.2 שלוש דרכים לערוך את הקובץ
- מנהל הקבצים בפאנל האחסון (cPanel, Plesk, DirectAdmin ודומיהם). זו הדרך שאני מעדיף, כי גם אם האתר נופל, הפאנל ממשיך לעבוד ואפשר להחזיר את הגיבוי מיד.
- FTP או SFTP עם תוכנה כמו FileZilla. מתאים כשעובדים עם עורך קוד במחשב.
- עורך הקבצים של תוסף SEO. ב-Yoast SEO יש עורך קבצים תחת Tools, ב-Rank Math יש עורך דומה בהגדרות הכלליות. אני לא משתמש בו לשינויים משמעותיים: אם השינוי מפיל את האתר, גם העורך נופל איתו.
2.3 גיבוי htaccess לפני כל שינוי
לפני כל שינוי: מורידים עותק של הקובץ למחשב, או משכפלים אותו בשרת בשם כמו htaccess-backup. אם משהו נשבר, מחזירים את העותק והאתר חוזר לעבוד תוך שניות. בלי גיבוי, שגיאת 500 יכולה להפוך לשעות של חיפוש.
3. המבנה הבסיסי של htaccess בוורדפרס
כל אתר וורדפרס עם כתובות קבועות יפות מקבל בלוק בסיסי שוורדפרס עצמו כותב ומנהל. הוא נראה כך:
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
הבלוק הזה מעביר כל בקשה לכתובת שאינה קובץ או תיקייה קיימים אל index.php, ושם וורדפרס מחליט איזה עמוד להציג. שני דברים חשובים לגביו:
- לא עורכים בתוך הבלוק. וורדפרס כותב מחדש את מה שבין BEGIN WordPress ל-END WordPress, למשל כששומרים את הגדרות הקישורים הקבועים, וכל שינוי שלכם שם יימחק.
- הכללים שלכם הולכים מעליו. השרת קורא את הקובץ מלמעלה למטה, וכללי הפניה ואבטחה צריכים לרוץ לפני שהבקשה מועברת לוורדפרס.
גם תוספים כותבים לקובץ בלוקים משלהם עם סימונים דומים, למשל WP Rocket עם BEGIN WP Rocket. לפני שמוסיפים כלל, כדאי לבדוק שתוסף לא כתב כבר כלל דומה.
4. כללי הפניה ב-htaccess
לפני הקוד, טבלה שמסכמת את כל 17 הכללים במדריך, כדי שתוכלו לבחור מה רלוונטי לאתר שלכם:
| # | כלל | תחום | המלצה |
|---|---|---|---|
| 1 | כפיית HTTPS | הפניות | חובה |
| 2 | איחוד www | הפניות | חובה |
| 3 | הפניית 301 לעמוד בודד | הפניות | לפי צורך |
| 4 | הפניית תיקייה שלמה | הפניות | לפי צורך |
| 5 | הגנה על wp-config.php | אבטחה | חובה |
| 6 | חסימת xmlrpc.php | אבטחה | מומלץ, אם לא משתמשים בו |
| 7 | הסתרת פרטי שרת | אבטחה | מומלץ |
| 8 | חסימת רשימת קבצים בתיקיות | אבטחה | חובה |
| 9 | הגנה על קבצי ht | אבטחה | מומלץ |
| 10 | חסימת PHP בתיקיית uploads | אבטחה | חובה |
| 11 | כותרות אבטחה | אבטחה | מומלץ מאוד |
| 12 | חסימת בוטים לפי User Agent | אבטחה ומשאבים | לפי צורך |
| 13 | דחיסת קבצים | ביצועים | חובה, אם השרת לא דוחס כבר |
| 14 | מטמון דפדפן | ביצועים | חובה, אם תוסף מטמון לא עושה זאת |
| 15 | Preload לקבצים קריטיים | ביצועים | למתקדמים |
| 16 | חסימת Hotlinking | משאבים | לפי צורך |
| 17 | עמודי שגיאה מותאמים | חוויית גולש | מומלץ |
4.1 כלל 1: כפיית HTTPS ב-htaccess
הכלל הזה מעביר אוטומטית כל מי שמגיע בכתובת http לגרסת https. גוגל מתייחס ל-HTTPS כאות דירוג, והדפדפנים מסמנים אתרים בלי HTTPS כלא מאובטחים.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>
איפה זה נשבר: כשגם תוסף SSL וגם htaccess מבצעים את אותה הפניה, או כשהאתר יושב מאחורי Cloudflare או פרוקסי אחר שמעביר לשרת בקשות ב-http. במקרה כזה הכלל רואה בכל בקשה HTTPS כבוי ויוצר לולאת הפניות. אם קיבלתם ERR_TOO_MANY_REDIRECTS אחרי שהוספתם את הכלל, זה הדבר הראשון לבדוק.
4.2 כלל 2: איחוד גרסת www
www.example.co.il ו-example.co.il הן מבחינה טכנית שתי כתובות שונות. אם שתיהן נפתחות בלי הפניה, גוגל צריך לנחש איזו מהן היא הראשית. הבחירה בין עם www לבלי www לא משנה לקידום, העיקר להיות עקביים. אם האתר כבר מדורג עם אחת מהן, משאירים אותה.
הפניה לגרסה בלי www:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [R=301,L]
</IfModule>
הפניה לגרסה עם www:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</IfModule>
שימו לב ללוכסן ההפוך לפני הנקודה. בביטוי רגולרי נקודה בלי לוכסן מתאימה לכל תו, וזו טעות נפוצה בקוד שמועתק מהרשת.
4.3 כלל 3: הפניית 301 לעמוד בודד ב-htaccess
כשמשנים כתובת של עמוד או מוחקים עמוד שיש לו קישורים ותנועה, הפניית 301 מעבירה את הגולשים ואת רוב הערך שנצבר לכתובת החדשה.
Redirect 301 /old-page/ https://example.co.il/new-page/
בוורדפרס, להפניות של עמודים בודדים אני בדרך כלל מעדיף את תוסף Redirection: יש לו ממשק נוח, יומן 404 וקל לראות בו את כל ההפניות במקום אחד. את htaccess אני שומר להפניות רחבות, כמו מעבר דומיין או שינוי מבנה שלם.
4.4 כלל 4: הפניית תיקייה שלמה
אם שיניתם, למשל, את כל המאמרים מ-/blog/ ל-/articles/, כלל אחד מטפל בכל הכתובות:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^blog/(.*)$ /articles/$1 [R=301,L]
</IfModule>
כלל כזה חייב להופיע מעל הבלוק של וורדפרס. אחרת הבקשה כבר הועברה ל-index.php וההפניה לא תרוץ. ואל תערבבו לאותה כתובת גם Redirect וגם RewriteRule: אלה שני מודולים שונים, וסדר הריצה ביניהם לא תמיד תואם את הסדר בקובץ.
5. כללי אבטחה ב-htaccess
כל הקוד בפרק הזה כתוב בתחביר של Apache 2.4 (Require). הרבה מדריכים עדיין מציגים את התחביר הישן Order ו-Deny מ-Apache 2.2. הוא ממשיך לעבוד רק אם מודול התאימות לאחור מופעל בשרת, ולכן עדיף לעבור לתחביר החדש. אם אתם רוצים להבין למה האבטחה היא חלק מהעבודה השוטפת ולא משימה חד פעמית, כתבתי על זה במאמר על תחזוקת אתר.
5.1 כלל 5: הגנה על wp-config.php
wp-config.php מכיל את פרטי החיבור למסד הנתונים ואת מפתחות האבטחה של האתר. בשרת תקין PHP מריץ אותו ולא מציג את התוכן שלו, אבל אם PHP מפסיק לעבוד, הקובץ עלול להיות מוגש כטקסט. הכלל הזה סוגר את האפשרות לגשת אליו מהדפדפן בכלל:
<Files wp-config.php>
Require all denied
</Files>
וורדפרס עצמו טוען את הקובץ מהשרת ולא דרך הדפדפן, ולכן החסימה לא משפיעה על פעולת האתר.
5.2 כלל 6: חסימת xmlrpc.php ב-htaccess
xmlrpc.php הוא ממשק ישן לתקשורת חיצונית עם וורדפרס. הוא יעד נפוץ לניסיונות ניחוש סיסמאות, כי בקשה אחת אליו יכולה לנסות הרבה סיסמאות. רוב האתרים לא צריכים אותו.
<Files xmlrpc.php>
Require all denied
</Files>
מתי לא לחסום: Jetpack ואפליקציית וורדפרס הישנה למובייל משתמשים בו, וגם חלק מכלי הפרסום החיצוניים. אם אתם עובדים עם אחד מהם, חסמו רק אחרי שבדקתם שהם ממשיכים לעבוד.
5.3 כלל 7: הסתרת פרטי השרת
כברירת מחדל, חלק מהשרתים חושפים בכותרות ובעמודי השגיאה איזו גרסת Apache ו-PHP הם מריצים. המידע הזה עוזר לסורקים אוטומטיים לזהות אתרים עם גרסאות פגיעות.
ServerSignature Off
<IfModule mod_headers.c>
Header always unset X-Powered-By
Header unset X-Powered-By
</IfModule>
זו שכבת הגנה משנית, לא תחליף לעדכון. אתר שמריץ גרסת PHP שכבר לא מקבלת עדכוני אבטחה צריך שדרוג, לא הסתרה. בחלק מהאחסונים הדרך האמינה להסתיר את גרסת PHP היא ההגדרה expose_php בפאנל.
5.4 כלל 8: חסימת רשימת קבצים בתיקיות
אם השרת מאפשר זאת, מי שנכנס לתיקייה בלי קובץ אינדקס, למשל example.co.il/wp-content/uploads/2026/, יראה רשימה של כל הקבצים שבה. שורה אחת סוגרת את זה:
Options -Indexes
זו אחת הבדיקות הראשונות שאני עושה באתר שאני מקבל לתחזוקה. ברוב האחסונים זה כבר כבוי, אבל לא בכולם.
5.5 כלל 9: הגנה על קבצי htaccess עצמם
בהגדרות ברירת המחדל של Apache קבצים שמתחילים ב-.ht כבר חסומים לגישה מהדפדפן. אני מוסיף את הכלל בכל זאת, כי לא תמיד יודעים איך חברת האחסון הגדירה את השרת:
<FilesMatch "^\.ht">
Require all denied
</FilesMatch>
5.6 כלל 10: חסימת הרצת PHP בתיקיית uploads
תיקיית wp-content/uploads היא המקום שאליו וורדפרס ותוספים שומרים קבצים שמשתמשים מעלים. אם תוסף פגיע מאפשר להעלות לשם קובץ PHP, התוקף רק צריך לגלוש אליו כדי להריץ קוד בשרת. הכלל הזה מונע את ההרצה גם אם ההעלאה הצליחה.
את הקוד הזה שמים בקובץ htaccess נפרד שיוצרים בתוך התיקייה wp-content/uploads, לא בקובץ הראשי:
<FilesMatch "\.(?:php[0-9]?|phtml|phar)$">
Require all denied
</FilesMatch>
הכלל חוסם גם סיומות כמו php7 ו-phtml, שחלק מהשרתים מריצים כ-PHP. אחרי ההוספה כדאי לבדוק שהתמונות, הקבצים ותוספי הטפסים ממשיכים לעבוד כרגיל.
5.7 כלל 11: כותרות אבטחה ב-htaccess
כותרות אבטחה אומרות לדפדפן של הגולש איך להתנהג מול האתר: אם מותר להציג אותו בתוך iframe באתר אחר, אם מותר לנחש סוג קובץ, ואיזה מידע לשלוח כשלוחצים על קישור יוצא.
<IfModule mod_headers.c>
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-Content-Type-Options "nosniff"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header always set Permissions-Policy "geolocation=(), microphone=(), camera=()"
</IfModule>
- X-Frame-Options: מונע מאתרים אחרים להטמיע את האתר שלכם ב-iframe, הגנה מפני Clickjacking.
- X-Content-Type-Options: מונע מהדפדפן לנחש סוג קובץ ולהריץ אותו בצורה שלא התכוונתם.
- Referrer-Policy: שולט בכמה מידע על הכתובת שלכם עובר לאתר אחר כשגולש לוחץ על קישור.
- Permissions-Policy: חוסם גישה למיקום, למיקרופון ולמצלמה. אם יש באתר מפה או צ'אט וידאו, צריך להתאים את הכותרת.
במדריכים ישנים תמצאו גם X-XSS-Protection. דפדפנים מודרניים כבר לא משתמשים בה, ולכן אני לא מוסיף אותה. את Strict-Transport-Security (HSTS) אני מוסיף רק אחרי שווידאתי שכל האתר וכל תתי הדומיינים עובדים ב-HTTPS, כי הדפדפן זוכר אותה לתקופה ארוכה וקשה לבטל אותה. אחרי ההטמעה אפשר לבדוק את התוצאה ב-securityheaders.com.
5.8 כלל 12: חסימת בוטים לפי User Agent
חלק מהבוטים לא מביאים לאתר שום תועלת ורק צורכים משאבי שרת: סורקים של כלי SEO שאתם לא משתמשים בהם, ובוטים שמגרדים תוכן. כך חוסמים אותם ברמת השרת:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} (mj12bot|dotbot|petalbot|blexbot) [NC]
RewriteRule .* - [F,L]
</IfModule>
שלוש הערות לפני שמעתיקים:
- אף פעם לא חוסמים את Googlebot או Bingbot. לפני שמוסיפים שם לרשימה, בודקים בדיוק למי הוא שייך.
- אם אתם משתמשים ב-Ahrefs או Semrush כדי לנתח את האתר שלכם, אל תחסמו את הבוטים שלהם. תקבלו נתונים חסרים.
- User Agent אפשר לזייף. בוט זדוני באמת יציג את עצמו כדפדפן רגיל. הכלל הזה מסנן בעיקר בוטים שמזדהים בשמם.
לגבי בוטים של מנועי AI, כמו GPTBot ו-ClaudeBot, ההחלטה מורכבת יותר כי חסימה שלהם משפיעה על הנוכחות שלכם בתשובות של מנועי AI. פירטתי את זה במדריך על זחלני AI.
6. כללי ביצועים ב-htaccess
מהירות טעינה משפיעה על חוויית הגולש ועל מדדי Core Web Vitals. שני הכללים הראשונים בפרק הזה הם הבסיס, אבל לפני שמוסיפים אותם כדאי לבדוק מה כבר קיים: הרבה אחסונים דוחסים כברירת מחדל, ותוספי מטמון כמו WP Rocket כותבים לקובץ כללים משלהם. על המדדים עצמם הרחבתי במאמר על Core Web Vitals.
6.1 כלל 13: דחיסת קבצים ב-htaccess
דחיסה מקטינה את קבצי הטקסט שהשרת שולח לדפדפן: HTML, CSS, JavaScript, JSON ו-SVG. בקבצי טקסט החיסכון בדרך כלל משמעותי מאוד. תמונות בפורמט JPEG, PNG ו-WebP כבר דחוסות, ולכן לא מוסיפים אותן.
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css
AddOutputFilterByType DEFLATE text/javascript application/javascript application/x-javascript
AddOutputFilterByType DEFLATE application/json application/xml application/rss+xml application/xhtml+xml
AddOutputFilterByType DEFLATE image/svg+xml font/ttf font/otf
</IfModule>
שרתים חדשים תומכים גם ב-Brotli, שדוחס טוב יותר מ-Gzip. אם האחסון או ה-CDN שלכם כבר מפעילים Brotli, אין צורך בכלל הזה. כדי לבדוק, פותחים את כלי המפתחים בדפדפן, בלשונית Network, ומחפשים בכותרת content-encoding את הערך gzip או br.
6.2 כלל 14: מטמון דפדפן ב-htaccess
בביקור הראשון הדפדפן מוריד את כל הקבצים: תמונות, CSS, JavaScript ופונטים. הכלל הזה אומר לו כמה זמן לשמור אותם, כך שבביקור הבא הם נטענים מהמחשב של הגולש ולא מהשרת.
<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault "access plus 1 month"
# תמונות ופונטים: שנה
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
ExpiresByType image/gif "access plus 1 year"
ExpiresByType image/webp "access plus 1 year"
ExpiresByType image/avif "access plus 1 year"
ExpiresByType image/svg+xml "access plus 1 year"
ExpiresByType image/x-icon "access plus 1 year"
ExpiresByType font/woff2 "access plus 1 year"
ExpiresByType font/woff "access plus 1 year"
# CSS ו-JavaScript: חודש
ExpiresByType text/css "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
ExpiresByType text/javascript "access plus 1 month"
# HTML: קצר, כדי שעדכוני תוכן יופיעו מהר
ExpiresByType text/html "access plus 0 seconds"
</IfModule>
זמן ארוך ל-CSS ול-JavaScript עובד טוב בוורדפרס, כי רוב התבניות והתוספים מוסיפים לכתובת הקובץ מספר גרסה שמשתנה בכל עדכון. ל-HTML אני נותן זמן קצר מאוד, כדי שגולש חוזר יראה תוכן מעודכן. אם WP Rocket או תוסף מטמון אחר כבר כתב כללי Expires בקובץ, לא מוסיפים אותם פעם שנייה.
6.3 כלל 15: Preload לקבצים קריטיים
כותרת Link עם preload אומרת לדפדפן להתחיל להוריד קובץ חשוב עוד לפני שהוא מגיע אליו ב-HTML, למשל פונט ראשי או קובץ CSS מרכזי:
<IfModule mod_headers.c>
<FilesMatch "\.(html|php)$">
Header add Link "</wp-content/themes/your-theme/fonts/main.woff2>; rel=preload; as=font; type=font/woff2; crossorigin"
</FilesMatch>
</IfModule>
זה כלל למתקדמים. מגדירים preload רק לקובץ אחד או שניים שכל עמוד באמת צריך. יותר מזה מתחרה ברוחב הפס עם קבצים חשובים אחרים ומאט את הטעינה. במדריכים ישנים תמצאו גם HTTP/2 Server Push, אבל הדפדפנים המרכזיים כבר לא תומכים בו, ולכן לא משתמשים בו.
7. כללי htaccess לחיסכון במשאבים ולחוויית גולש
7.1 כלל 16: חסימת Hotlinking של תמונות
Hotlinking הוא מצב שבו אתר אחר מציג תמונה שלכם ישירות מהשרת שלכם. התמונה מופיעה אצלם, ורוחב הפס יורד אצלכם. הכלל הזה מחזיר שגיאה לבקשות תמונה שמגיעות מאתרים אחרים:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https?://(www\.)?example\.co\.il [NC]
RewriteCond %{HTTP_REFERER} !(google|bing|facebook|whatsapp)\. [NC]
RewriteRule \.(jpe?g|png|gif|webp|avif)$ - [F,NC]
</IfModule>
מחליפים את example.co.il בדומיין שלכם. השורה הראשונה מאפשרת בקשות בלי Referer, כי חלק מהדפדפנים והאפליקציות לא שולחים אותו. השורה השלישית משאירה גישה למנועי חיפוש ולרשתות חברתיות, כדי שהתמונות ימשיכו להופיע בתוצאות ובתצוגה מקדימה של קישורים. אם התמונות מוגשות דרך CDN, ההגנה צריכה להיות מוגדרת ב-CDN ולא כאן.
7.2 כלל 17: עמודי שגיאה מותאמים
את עמוד ה-404 וורדפרס מטפל בעצמו דרך התבנית, ולכן אין צורך להגדיר אותו ב-htaccess. מה שכן שווה להגדיר הוא עמוד לשגיאות שהשרת מחזיר לפני שוורדפרס רץ, כמו 403. אני מכין קובץ HTML סטטי פשוט עם הלוגו, משפט הסבר וקישור לעמוד הבית:
ErrorDocument 403 /errors/403.html
ErrorDocument 500 /errors/500.html
למה קובץ סטטי ולא עמוד בוורדפרס? כי כשיש שגיאת שרת, יש סיכוי טוב שגם וורדפרס לא עובד, ואז עמוד שגיאה שתלוי בו לא ייטען. חשוב לדעת שלא כל שגיאה פנימית של PHP עוברת דרך ההגדרה הזו. זה תלוי באופן שבו השרת מריץ PHP.
8. קובץ htaccess מלא לאתר וורדפרס חדש
זה הקובץ המלא, עם הכללים שמתאימים לרוב האתרים. לפני שמשתמשים בו: מגבים את הקובץ הקיים, מחליפים את example.co.il בדומיין שלכם, בוחרים גרסת www אחת ובודקים שאף תוסף לא כתב כבר את אותם כללים. כללי Hotlinking, Preload ועמודי השגיאה לא כלולים כאן, כי הם תלויים באתר.
# ============================================
# htaccess לאתר וורדפרס: כללים מותאמים
# ============================================
# 1. כפיית HTTPS
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# 2. הפניה לגרסה בלי www
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [R=301,L]
</IfModule>
# 5. הגנה על wp-config.php
<Files wp-config.php>
Require all denied
</Files>
# 6. חסימת xmlrpc.php (רק אם לא משתמשים בו)
<Files xmlrpc.php>
Require all denied
</Files>
# 7. הסתרת פרטי שרת
ServerSignature Off
<IfModule mod_headers.c>
Header always unset X-Powered-By
Header unset X-Powered-By
</IfModule>
# 8. חסימת רשימת קבצים בתיקיות
Options -Indexes
# 9. הגנה על קבצי ht
<FilesMatch "^\.ht">
Require all denied
</FilesMatch>
# 11. כותרות אבטחה
<IfModule mod_headers.c>
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-Content-Type-Options "nosniff"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header always set Permissions-Policy "geolocation=(), microphone=(), camera=()"
</IfModule>
# 13. דחיסה (רק אם השרת לא דוחס כבר)
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css
AddOutputFilterByType DEFLATE text/javascript application/javascript application/json
AddOutputFilterByType DEFLATE application/xml application/rss+xml image/svg+xml
</IfModule>
# 14. מטמון דפדפן (רק אם תוסף מטמון לא כתב כבר כללים)
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
ExpiresByType image/webp "access plus 1 year"
ExpiresByType image/avif "access plus 1 year"
ExpiresByType image/svg+xml "access plus 1 year"
ExpiresByType font/woff2 "access plus 1 year"
ExpiresByType text/css "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
ExpiresByType text/html "access plus 0 seconds"
</IfModule>
# ============================================
# הבלוק של וורדפרס: לא לערוך
# ============================================
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
ואת כלל 10, חסימת PHP בתיקיית uploads, שמים בקובץ נפרד בתוך wp-content/uploads, כמו שהוסבר בסעיף 5.6.
9. איך בודקים שהשינוי ב-htaccess עובד
אחרי כל שינוי אני עובר על הרשימה הזו. זה לוקח כמה דקות וחוסך הפתעות:
- האתר נטען? גולשים לעמוד הבית ולעוד שני עמודים בחלון גלישה בסתר. אם יש שגיאת 500, מחזירים את הגיבוי מיד ורק אחר כך מחפשים את הסיבה.
- ממשק הניהול עובד? נכנסים ל-wp-admin, מתחברים ושומרים טיוטה.
- ההפניות נכונות? נכנסים לכתובת עם http ועם www (או בלי) ובודקים שמגיעים לכתובת הראשית בהפניה אחת, בלי שרשרת.
- הקבצים הרגישים חסומים? גלישה ל-wp-config.php ול-xmlrpc.php צריכה להחזיר 403.
- הכותרות במקום? בכלי המפתחים, בלשונית Network, בודקים את כותרות התגובה של העמוד, או מריצים את האתר ב-securityheaders.com.
- טפסים, תוספים והעלאות עובדים? שולחים טופס בדיקה ומעלים תמונה לספריית המדיה.
- המהירות לא נפגעה? מריצים את האתר ב-PageSpeed Insights ומשווים למדידה מלפני השינוי.
טעויות נפוצות בעבודה עם htaccess
- עבודה בלי גיבוי. הטעות הכי נפוצה והכי יקרה. עותק של הקובץ לפני כל שינוי, גם שינוי של שורה אחת.
- כפילות עם תוספים. תוסף SSL, תוסף מטמון ותוסף אבטחה כותבים לקובץ כללים משלהם. כשמוסיפים ידנית את אותו כלל, מקבלים לולאות הפניה או כותרות כפולות. לפני כל תוספת קוראים את הקובץ כולו.
- עריכה בתוך הבלוק של וורדפרס. כל מה שבין BEGIN WordPress ל-END WordPress נדרס כשוורדפרס כותב את הקובץ מחדש. הכללים שלכם הולכים מעליו.
- תחביר ישן. Order ו-Deny הם תחביר של Apache 2.2. בשרת Apache 2.4 בלי מודול תאימות הם מחזירים שגיאת 500. ב-2.4 משתמשים ב-Require.
- שימוש ב-php_value. הוראות כמו php_value upload_max_filesize עובדות רק כש-PHP רץ כמודול של Apache. ברוב האחסונים היום PHP רץ בנפרד (PHP-FPM), ושם השורה הזו מפילה את האתר. מגבלות העלאה וזמן ריצה משנים בפאנל האחסון או בקובץ user.ini.
- חסימת בוטים בלי לבדוק. שם שגוי ברשימה יכול לחסום מנוע חיפוש לגיטימי, והנזק לתנועה מתגלה רק אחרי שבועות. בודקים כל שם לפני שמוסיפים אותו.
- הרשאות שגויות. ההרשאה המקובלת לקובץ היא 644. חלק מהשרתים מסרבים לקרוא קובץ עם הרשאות פתוחות מדי ומחזירים שגיאת 500, ובכל מקרה הרשאת 777 היא סיכון אבטחה.
סיכום: htaccess קטן, השפעה גדולה
קובץ htaccess משפיע על שלושה תחומים בבת אחת: אבטחה, מהירות וקידום. כללי ההפניה שומרים על הערך שצברתם בגוגל, כללי האבטחה עוצרים בקשות זדוניות לפני שוורדפרס בכלל נטען, וכללי הביצועים מקצרים את זמן הטעינה. חצי שעה של עבודה מסודרת על הקובץ יכולה לחסוך כמה תוספים שעושים את אותה עבודה ברמה איטית יותר.
אבל זה גם הקובץ שהכי קל להפיל איתו אתר. לכן הכללים במדריך הם נקודת פתיחה, לא קובץ להעתקה עיוורת: גיבוי, כלל אחד בכל פעם, בדיקה אחרי כל שינוי. ככה אני עובד בכל אתר וורדפרס שאני מקים, וזה החלק בעבודה שהלקוח לא רואה אבל מרגיש.
אם אתם לא בטוחים מה יש היום בקובץ שלכם, או שאחרי שינוי האתר התחיל להתנהג מוזר, שלחו לי הודעה ונבדוק יחד.
שאלות נפוצות על htaccess
מה זה קובץ htaccess?
קובץ htaccess הוא קובץ הגדרות טקסט שיושב בתיקיות האתר ומשנה את התנהגות שרת Apache או LiteSpeed ברמת התיקייה. בוורדפרס הוא אחראי לכתובות הקבועות, ואפשר להוסיף בו כללי הפניה, אבטחה, דחיסה ומטמון.
איפה נמצא קובץ htaccess בוורדפרס?
בתיקייה הראשית של האתר, לצד wp-config.php, בדרך כלל בתיקייה public_html. הוא קובץ נסתר, ולכן צריך להפעיל הצגת קבצים נסתרים במנהל הקבצים כדי לראות אותו.
למה אני לא רואה את קובץ htaccess?
יש שלוש סיבות נפוצות: הקבצים הנסתרים לא מוצגים במנהל הקבצים, וורדפרס עוד לא יצר את הקובץ, או שהאתר רץ על שרת Nginx שלא משתמש בו. כדי שוורדפרס ייצור אותו, נכנסים להגדרות הקישורים הקבועים ולוחצים שמירה.
מה עושים אם האתר נפל אחרי שינוי ב-htaccess?
מחזירים את הגיבוי דרך מנהל הקבצים או FTP. אם אין גיבוי, משנים את שם הקובץ כדי לנטרל אותו, נכנסים לממשק הניהול ושומרים מחדש את הגדרות הקישורים הקבועים. וורדפרס ייצור קובץ בסיסי חדש, ואת הכללים הנוספים מחזירים אחד אחד.
האם htaccess עובד בשרת Nginx?
לא. Nginx לא קורא קבצי htaccess, וההגדרות המקבילות נכתבות בקובץ התצורה של השרת. ברוב האחסונים רק חברת האחסון יכולה לשנות אותו. Apache ו-LiteSpeed כן קוראים את הקובץ.
האם htaccess משפיע על קידום בגוגל?
בעקיפין, כן. הפניות 301 נכונות שומרות על הערך של עמודים שהכתובת שלהם השתנתה, איחוד גרסאות http ו-www מונע כפילויות, ודחיסה ומטמון משפרים את זמן הטעינה. מצד שני, טעות בקובץ יכולה לחסום סורקים או להפיל את האתר.
האם תוסף אבטחה מחליף את htaccess?
לא לגמרי. תוסף אבטחה רץ אחרי שוורדפרס נטען, ואילו כלל ב-htaccess עוצר את הבקשה עוד ברמת השרת. הרבה תוספי אבטחה כותבים בעצמם כללים לקובץ, ולכן כדאי לבדוק מה הם הוסיפו לפני שמוסיפים כללים ידנית.
מה ההרשאות הנכונות לקובץ htaccess?
ההרשאה המקובלת היא 644: הבעלים יכול לקרוא ולכתוב, וכל השאר יכולים רק לקרוא. הרשאות פתוחות מדי הן סיכון אבטחה, וחלק מהשרתים אף מסרבים לקרוא את הקובץ ומחזירים שגיאת 500.