بهروزرسانی شده ۱ ماه پیش
GET אומר "שלח לי את זה." HEAD אומר "תאר לי את זה."
זה כל ההבדל. בקשת HEAD מבקשת את אותה תגובה כמו GET — אותו קוד סטטוס, אותן כותרות — אבל השרת מסתיר את הגוף. אתה לומד הכל על משאב מבלי לקבל אותו. סיור לפני מחויבות.
מה HEAD עושה
בקשת GET:
בקשת HEAD:
אתה לומד שהקובץ הוא 524 מגהבייט, שהוא MP4, ומתי הוא שונה לאחרונה — מבלי להוריד אפילו בייט אחד של וידאו.
מתי להשתמש ב-HEAD
HEAD מתאים במיוחד כאשר אתה צריך לדעת על משאבים מבלי לאחזר אותם:
בדיקה אם משאבים קיימים:
בדיקת קישורים: סורקי אינטרנט ובודקי קישורים מאמתים קישורים מבלי להוריד דפים:
בדיקת גדלי קבצים לפני הורדה:
אימות רעננות משאב:
קביעת סוגי תוכן:
HEAD ומטמון
תגובות HEAD עוקבות אחרי אותם כללי מטמון כמו GET. דפדפנים ושרתי פרוקסי שומרים תגובות HEAD במטמון ויכולים להחזיר אותן מבלי לפנות לשרת המקור.
זה הופך את HEAD לשימושי לאימות מטמון:
דרישות יישום
RFC 91101 מציין שהשרתים צריכים לשלוח את אותן כותרות בתגובה ל-HEAD כפי שהיו שולחים ל-GET. המפרט משתמש ב-"should" ולא ב-"must" מכיוון שכותרות מסוימות ניתן לקבוע רק בזמן יצירת התוכן — ויצירת תוכן מלא רק כדי להשליך אותו מסכלת את מטרתו של HEAD.
כלומר, טיפול HEAD שממומש היטב:
- בודק הרשאות
- קובע סוג תוכן
- מחשב את אורך התוכן (אם ידוע מבלי ליצור תוכן)
- מגדיר כותרות מטמון ו-ETags
- אינו שולח את הגוף
מימוש יעיל:
אחזר רק מטה-נתונים — אל תייצר תוכן מלא רק כדי להשליך אותו.
HEAD לעומת GET לבדיקת קיום
יתרונות HEAD:
- חוסך ברוחב פס (לא מועבר גוף)
- מהיר יותר עבור משאבים גדולים
- מבטא כוונה בצורה ברורה ("רק בודק")
יתרונות GET:
- כנראה תצטרך את התוכן ממילא
- בקשה אחת במקום HEAD ואז GET
- חלק מהשרתים לא תומכים ב-HEAD כראוי
הנחיה כללית: השתמש ב-HEAD כאשר אתה רק בודק קיום או מטה-נתונים. השתמש ב-GET כאשר תצטרך את התוכן אם הוא קיים.
שיקולי אבטחה
בקשות HEAD יכולות לדלוף מידע. החל את אותן הגנות כמו GET:
נדרש אימות זהות: HEAD צריך לאכוף את אותו אימות זהות והרשאה כמו GET:
חשיפת מידע: כותרות יכולות לחשוף מידע רגיש:
ודא שתגובות HEAD לא מדליפות מידע שגם GET לא היה חושף.
אי-עקביות בתמיכת שרתים
בעוד שהשרתים אמורים לתמוך ב-HEAD עבור כל נקודת קצה של GET, המציאות מסובכת יותר:
- חלק מהשרתים מחזירים
405 Method Not Allowed - חלק מחזירים כותרות שונות ממה ש-GET היה מחזיר
- חלק מהמסגרות לא ממירות אוטומטית טיפולי GET ל-HEAD
פתרון עקיפה לצד הלקוח:
HEAD ובקשות טווח
HEAD עובד עם כותרות Range לבדיקה אם שרת תומך בתוכן חלקי:
מנהלי הורדות משתמשים בזה כדי לקבוע אם הורדות מקבילות של חלקים אפשריות.
HEAD ב-APIs
ממשקי RESTful API צריכים לתמוך ב-HEAD עבור נקודות קצה של משאבים:
חלק מממשקי ה-API משתמשים ב-HEAD לבדיקות תקינות:
דפוסי ביצועים
GET מותנה: בדוק רעננות לפני הורדה:
בדיקת גודל מראש:
בדיקת זמינות מחזורית:
שאלות נפוצות על שיטת HTTP HEAD
מדוע שרת לא יתמוך ב-HEAD אם הוא תומך ב-GET?
חלק ממסגרות האינטרנט לא מייצרות אוטומטית טיפולי HEAD מטיפולי GET, מה שמחייב מפתחים ליישם אותם בנפרד. מימושים עצלים או חלקיים פשוט משמיטים תמיכה ב-HEAD. אחרים מחזירים 405 Method Not Allowed מכיוון שהם הגבילו במפורש שיטות מבלי לקחת בחשבון את HEAD.
האם ניתן לשמור תגובות HEAD במטמון?
כן. תגובות HEAD עוקבות אחרי אותם כללי מטמון כמו GET. דפדפנים ושרתי פרוקסי שומרים תגובות HEAD במטמון ויכולים להחזיר אותן לבקשות HEAD עוקבות מבלי לפנות לשרת המקור. כותרות המטמון (Cache-Control, ETag, Last-Modified) פועלות באופן זהה.
האם HEAD מהיר יותר מ-GET?
מבחינת תעבורת הרשת, כן — ללא גוף משמעו פחות נתונים. אך בצד השרת, זה תלוי במימוש. טיפול HEAD שממומש היטב מאחזר רק מטה-נתונים. מימוש גרוע מייצר את התגובה המלאה ומשליך את הגוף, וחוסך רק את זמן ההעברה.
האם כדאי להשתמש ב-HEAD לבדיקה אם נקודת קצה של API קיימת לפני קריאה אליה?
בדרך כלל לא. אם אתה צריך את הנתונים, פשוט קרא ל-GET — בקשה אחת עדיפה על שתיים. HEAD הגיוני כאשר אתה באמת צריך רק מטה-נתונים: בדיקה אם קובץ קיים לפני הצגת כפתור הורדה, אימות שתוכן לא השתנה לפני רענון מטמון, או אימות קישורים מבלי להוריד דפים.
מקורות
آیا این صفحه مفید بود؟