1. ספרייה
  2. HTTP והרשת
  3. קודי סטטוס HTTP

עודכן לפני חודש

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

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

מה השרת באמת אומר

כאשר שרת מחזיר 404 Not Found, הוא מציין טענה ספציפית:

  • הבנתי את הבקשה שלך
  • חיפשתי את מה שביקשת
  • זה לא קיים בכתובת הזו
  • אני לא יודע אם זה אי פעם היה קיים או יהיה
GET /blog/that-post-you-bookmarked HTTP/1.1

HTTP/1.1 404 Not Found

הנקודה האחרונה חשובה. 404 הוא מטבעו מלא אי-ודאות. השרת לא אומר "זה נמחק" או "זה מעולם לא היה קיים" — רק "זה לא כאן עכשיו."

למה דברים נעלמים

טעויות הקלדה. מישהו מקליד /usr/profile במקום /user/profile. תו אחד — יעד שונה לחלוטין.

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

דברים נמחקים. מוצרים שהופסקו, חשבונות שנסגרו, פוסטים שהוסרו. ה-URL הופך לרוח רפאים.

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

מזהים לא קיימים. GET /api/users/99999 — אבל אין משתמש 99999. מעולם לא היה.

404 מול 410: אי-ודאות מול ודאות

ההבחנה הזו חשובה יותר ממה שנדמה.

404 Not Found אומר "אני לא יודע מה קרה לזה":

GET /blog/some-post

HTTP/1.1 404 Not Found

מנועי חיפוש רואים זאת וחושבים: אולי זה יחזור. אבדוק שוב מאוחר יותר.

410 Gone אומר "זה היה קיים והוסר במכוון":

GET /blog/retracted-article

HTTP/1.1 410 Gone

מנועי חיפוש רואים זאת וחושבים: להסיר מהאינדקס. זה לא חוזר.

השתמש ב-410 כאשר אתה יודע. השתמש ב-404 כאשר אינך יודע.

404 מול 403: חסר מול אסור

הבחנה חשובה נוספת:

404 אומר שהמשאב לא קיים. 403 Forbidden אומר שהוא קיים אבל אין לך גישה אליו.

GET /api/users/123/private-data

HTTP/1.1 403 Forbidden

לפעמים תראה 404 משמש במקום 403 בכוונה — כדי להסתיר ממשתמשים לא מורשים אם משאב בכלל קיים. אם תוקף לא יכול להבחין בין "לא קיים" לבין "קיים אבל אסור" — זה יתרון אבטחה.

בעיית ה-Soft 404

זו טעות נפוצה שגורמת נזק ממשי:

GET /deleted-page

HTTP/1.1 200 OK

<html>
  <body>Sorry, this page doesn't exist!</body>
</html>

הדף אומר "לא נמצא" אבל קוד הסטטוס אומר "הצלחה." זה מבלבל מנועי חיפוש. הם מאנדקסים את הודעת "הדף לא נמצא" שלך כאילו הייתה תוכן אמיתי. ה-SEO שלך נפגע. משתמשים מוצאים את דפי השגיאה שלך בתוצאות החיפוש.

תמיד החזר קוד סטטוס 404 אמיתי עבור תוכן חסר. הגוף יכול להיות ידידותי. קוד הסטטוס חייב להיות כנה.

להפוך מבוי סתום להכוונה

דף 404 הוא רגע של חיכוך. המשתמש רצה משהו ולא קיבל אותו. מה שתעשה עכשיו קובע אם הוא יעזוב מתוסכל או ימצא את דרכו.

המינימום: ספר לו מה קרה ותן לו דרך לחזור הביתה.

<h1>Page Not Found</h1>
<p>We couldn't find what you're looking for.</p>
<a href="/">Go to homepage</a>

טוב יותר: תן לו אפשרויות.

<h1>That page doesn't exist</h1>
<p>Maybe one of these will help:</p>
<ul>
    <li><a href="/">Homepage</a></li>
    <li><a href="/products">Products</a></li>
    <li><a href="/support">Support</a></li>
</ul>
<form action="/search">
    <input type="text" name="q" placeholder="Search...">
    <button type="submit">Search</button>
</form>

המטרה: להפוך "אתה אבוד" ל"הנה כמה דרכים קדימה."

תגובות API

ממשקי API צריכים להיות ספציפיים לגבי מה שלא נמצא:

GET /api/users/99999

HTTP/1.1 404 Not Found
Content-Type: application/json

{
    "error": "User not found",
    "code": "USER_NOT_FOUND",
    "userId": 99999
}

לקוחות יכולים לטפל בזה בצורה משמעותית:

async function getUser(userId) {
    const response = await fetch(`/api/users/${userId}`);

    if(response.status === 404) {
        return null;
    }

    if(!response.ok) {
        throw new Error(`Request failed: ${response.status}`);
    }

    return response.json();
}

מתי להפנות במקום להחזיר שגיאה

אם התוכן עבר ולא נעלם, עדיף להפנות — לא להחזיר 404:

GET /blog/old-url

HTTP/1.1 301 Moved Permanently
Location: /blog/new-url

זה שומר על מסע המשתמש ומודיע למנועי החיפוש לאן עבר התוכן. השתמש ב-404 רק כאשר אין באמת כלום בכתובת הזו ואין לאן להפנות.

ניטור הפערים

כל 404 הוא מידע. מישהו ציפה שמשהו יהיה שם — בין אם בגלל שגיאת הקלדה, בגלל שמשהו נשבר, או בגלל שהזזת משהו בלי להפנות.

תתעד את ה-404 שלך:

app.use(function(request, response, next) {
    response.on('finish', function() {
        if(response.statusCode === 404) {
            logger.warn({
                url: request.url,
                referrer: request.headers.referer,
                timestamp: new Date()
            });
        }
    });
    next();
});

חפש דפוסים. אם אותה כתובת URL מופיעה שוב ושוב, משהו מקשר אליה. אם ה-referrer הוא האתר שלך עצמו, יש לך קישור פנימי שבור. אם הוא חיצוני, שקול להוסיף הפניה לאן שהתוכן הזה הלך.

המציאות האנושית

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

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

שאלות נפוצות על 404 Not Found

האם להשתמש ב-404 או ב-410 עבור תוכן שנמחק?

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

למה חלק מהאתרים מחזירים 404 במקום 403 עבור תוכן אסור?

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

כמה שגיאות 404 הן יותר מדי?

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

מה ההבדל בין 404 ל-soft 404?

404 אמיתי מחזיר קוד סטטוס HTTP 404. soft 404 מחזיר קוד סטטוס 200 (הצלחה) אבל מציג תוכן של "הדף לא נמצא." soft 404 מבלבלים מנועי חיפוש ותמיד יש לתקן אותם — תמיד החזר את קוד הסטטוס האמיתי שתואם את המציאות.

האם דף זה היה מועיל?

😔
🤨
😃
404 לא נמצא • ספרייה • Connected