דילוג לתוכן
שרת ו-.htaccess

פוסטים בוורדפרס מחזירים 404 אבל דף הבית עובד

אם דף הבית נטען בלי בעיה אבל כל פוסט ועמוד בודד מחזיר שגיאת 404, כללי כתיבת ה-URL שוורדפרס מסתמך עליהם חסרים או שבורים ב

פורסם

אם דף הבית נטען בלי בעיה אבל כל פוסט ועמוד בודד מחזיר שגיאת 404, כללי כתיבת ה-URL שוורדפרס מסתמך עליהם חסרים או שבורים בקובץ .htaccess שלך. התיקון המהיר ביותר: היכנס אל הגדרות → קישורים קבועים בממשק הניהול ולחץ על שמירת שינויים בלי לשנות שום דבר. זה מכריח את וורדפרס לייצר מחדש את בלוק כללי הכתיבה. אם שגיאות ה-404 ממשיכות, אז ה-.htaccess שלך אינו ניתן לכתיבה על ידי שרת הרשת, Apache מוגדר להתעלם ממנו, או שאתה על Nginx (שלא משתמש ב-.htaccess בכלל).

למה דף הבית עובד אבל הפוסטים לא

דף הבית שלך עובד כי בקשה אל / מוגשת ישירות מ-index.php בשורש התיקייה. אין צורך בשום כתיבה מחדש.

בקשה אל /2026/my-post/ שונה. הנתיב הזה אינו תיקייה אמיתית על הדיסק. כדי שוורדפרס יענה עליו, Apache צריך לנתב פנימית את הבקשה אל index.php, ואז וורדפרס קורא את REQUEST_URI, משווה אותו אל כללי הכתיבה השמורים באפשרות rewrite_rules בבסיס הנתונים, פותר את משתני השאילתה (WP::parse_request()), וטוען את הפוסט הנכון.

המעבר מ-Apache אל index.php הוא החלק שנשבר. הוא תלוי לחלוטין בבלוק הזה ב-.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

שתי שורות ה-RewriteCond אומרות: אם הנתיב המבוקש אינו קובץ אמיתי (!-f) ואינו תיקייה אמיתית (!-d), שלח אותו אל index.php. הסר את הבלוק הזה ו-Apache יחפש תיקייה מילולית בשם /2026/my-post/, לא ימצא אותה, ויחזיר שגיאת 404 משלו — לפני שוורדפרס בכלל רואה את הבקשה.

למה וורדפרס דורס את .htaccess כשאתה שומר קישורים קבועים

זה החלק שרוב המדריכים מדלגים עליו. כשאתה לוחץ על שמירה במסך הקישורים הקבועים, וורדפרס קורא ל-flush_rewrite_rules(). על Apache עם .htaccess שניתן לכתיבה, זה מפעיל את save_mod_rewrite_rules(), שמייצר מחדש את הבלוק שלמעלה דרך WP_Rewrite::mod_rewrite_rules() וכותב אותו חזרה באמצעות insert_with_markers().

insert_with_markers() נוגע רק בשורות שבין # BEGIN WordPress לבין # END WordPress. כל מה שמחוץ לסימונים האלה נשאר ללא שינוי. כל מה שבפנים נמחק ונכתב מחדש. גרסאות חדשות יותר של וורדפרס אפילו מדפיסות את האזהרה ישירות בקובץ:

כל שינוי בהנחיות שבין הסימונים האלה יידרס.

אז “וורדפרס דורס לי את ה-.htaccess” נכון אבל מדויק מאוד: הוא כותב מחדש רק את הבלוק המסומן שלו, ורק כשהקובץ ניתן לכתיבה. אם הקובץ אינו ניתן לכתיבה, השמירה בשקט לא עושה כלום לדיסק. וורדפרס מציג הודעה צהובה במסך הקישורים הקבועים שאומרת לך להדביק את הכללים ידנית, ואם פספסת את ההודעה הזאת, בלוק הכתיבה שלך נשאר חסר וכל פוסט ממשיך להחזיר 404.

איך לתקן את זה, לפי הסדר

1. שמור מחדש את הקישורים הקבועים שלך. הגדרות → קישורים קבועים → שמירת שינויים. אין צורך בשום עריכה. זה מפעיל מחדש את הרענון וכותב מחדש את הבלוק. זה פותר את רוב המקרים, כולל כללים מיושנים אחרי העברה.

2. בדוק ש-.htaccess קיים וניתן לכתיבה. הוא נמצא באותה תיקייה כמו wp-config.php. זה קובץ נסתר, אז הפעל “הצג קבצים מוסתרים” בלקוח ה-FTP שלך או השתמש ב:

ls -la /path/to/wordpress/.htaccess

אם הוא חסר, צור אותו והדבק את הבלוק הנכון. אם ההתקנה שלך נמצאת בתת-תיקייה, RewriteBase ויעד הכתיבה הסופי חייבים להתאים לנתיב הזה — טעות בזה היא הסיבה הנפוצה ביותר לכך שבלוק שהודבק ידנית עדיין מחזיר 404. מחולל ה-.htaccess שלנו בונה את הבלוק המדויק לנתיב ההתקנה שלך כדי שלא תצטרך לנחש.

3. ודא ש-Apache מורשה לקרוא את .htaccess. אם ל-virtual host יש AllowOverride None, Apache מתעלם מהקובץ לחלוטין ללא קשר לתוכן שלו. אתה צריך AllowOverride All (או לפחות FileInfo) על תיקיית וורדפרס. זה נמצא בהגדרות השרת, לא ב-.htaccess, אז זה דורש גישה לשרת:

<Directory /var/www/html>
    AllowOverride All
</Directory>

4. ודא ש-mod_rewrite מופעל. על Debian/Ubuntu:

sudo a2enmod rewrite
sudo systemctl restart apache2

5. על Nginx אין .htaccess. הכתיבות מחדש נכנסות ל-server block במקום זאת:

location / {
    try_files $uri $uri/ /index.php?$args;
}

אבחון מהיר: של מי ה-404?

הסתכל על עמוד ה-404. אם זה עמוד שגיאה לא מעוצב של Apache או של האחסון, Apache אף פעם לא הגיע לוורדפרס — זו בעיה של .htaccess או של הגדרות השרת (שלבים 2–4). אם זה עמוד ה-404 המעוצב של התבנית שלך, וורדפרס מקבל את הבקשה אבל לא מצליח להתאים אותה — הכללים בבסיס הנתונים מיושנים, ושמירה מחדש של הקישורים הקבועים (שלב 1) היא התיקון. ההבחנה האחת הזאת חוסכת לרוב האנשים שעה של ניחושים.

מה לא לעשות

אל תכבה קודם את כל התוספים שלך. תסמין נקי של “פוסטים 404, דף הבית עובד” הוא בעיית כתיבה מחדש, לא התנגשות בין תוספים. כיבוי תוספים הוא התשובה האוטומטית בפורומים והוא כמעט אף פעם לא נוגע בזה.

אל תעשה chmod 777 ל-.htaccess שלך. וורדפרס צריך שהקובץ יהיה ניתן לכתיבה על ידי משתמש שרת הרשת, וזה לא אותו דבר כמו ניתן לכתיבה לכולם. 644 עם הבעלים הנכון הוא בסדר ובטוח; 777 הוא חור אבטחה שגם לא יתקן את הניתוב בכל מקרה.

אל תדביק כללי כתיבה מותאמים אישית בתוך הסימונים # BEGIN WordPress / # END WordPress. הם יימחקו בפעם הבאה שמישהו ישמור קישורים קבועים. שים הנחיות מותאמות אישית מעל שורת # BEGIN WordPress.

אל תתקין מחדש את וורדפרס. קבצי הליבה בסדר. זה בלוק טקסט אחד חסר, לא התקנה פגומה.

אל תאשים את התבנית שלך. ניתוב הקישורים הקבועים הוא ליבת וורדפרס. תבנית לא יכולה לגרום לזה ולא יכולה לתקן את זה.

עדיין תקוע?

אם שמרת מחדש את הקישורים הקבועים, ודאת שהבלוק קיים וניתן לכתיבה, והגדרת AllowOverride All, החשוד שנותר הוא תוסף אבטחה או כלל ברמת האחסון שמייצר מחדש או נועל את .htaccess מאחורי הגב שלך. בדוק את חותמת הזמן של השינוי בקובץ מיד אחרי שמירת קישורים קבועים — אם היא לא השתנתה, משהו חוסם את הכתיבה. ייצר מחדש בלוק נקי באמצעות מחולל ה-.htaccess, הדבק אותו, ובדוק שוב עם רענון מלא.