ניהול ההתנהגות של המטמון

Firebase Hosting משתמש ב-CDN גלובלי כדי להפוך את האתר למהיר ככל האפשר.

כל התוכן הסטטי שמתבקש נשמר אוטומטית במטמון ב-CDN. אם תפרסו מחדש את התוכן של האתר, Firebase Hosting כל התוכן שנשמר במטמון ברשת ה-CDN יימחק באופן אוטומטי עד לבקשה הבאה.

עם זאת, מכיוון שהשירותים Cloud Functions ו-Cloud Run יוצרים תוכן באופן דינמי, התוכן של כתובת URL מסוימת יכול להשתנות בהתאם לקלט של המשתמש או לזהות שלו. כדי להתמודד עם זה, בקשות שמטופלות על ידי קוד backend לא נשמרות במטמון ב-CDN כברירת מחדל.

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

באופן דומה, אפשר להגדיר את התנהגות השמירה במטמון כדי להפחית את העלויות של הפעלת הפונקציה, כי התוכן מוגש מ-CDN ולא מפונקציה שהופעלה. מידע נוסף על אופטימיזציה של הפעלת פונקציות ושירותים זמין במסמכי העזרה של Cloud Functions ושל Cloud Run.

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

אם תשובת 404 כבר מכילה כותרות של שמירת נתונים במטמון שהוגדרו על ידי שירות Cloud Functions או Cloud Run, הן מבטלות את ברירת המחדל של 10 דקות וקובעות באופן מלא את התנהגות השמירה במטמון של ה-CDN.

במסמכי התיעוד למפתחים של Google מפורט מידע נוסף על התנהגות של שמירת נתונים במטמון.

הגדרת Cache-Control

הכלי העיקרי שבו משתמשים כדי לנהל את המטמון של תוכן דינמי הוא הכותרת Cache-Control. באמצעות הגדרת הכותרת הזו, אתם יכולים להעביר לדפדפן ול-CDN מידע על משך הזמן שבו התוכן יכול להישמר במטמון. בפונקציה, הגדרת את Cache-Control כך:

res.set('Cache-Control', 'public, max-age=300, s-maxage=600');

בדוגמה הזו של כותרת, ההוראות עושות שלושה דברים:

  • public – סימון התשובה כpublic. המשמעות היא שגם הדפדפן וגם מטמון הביניים (כולל ה-CDN של Firebase Hosting) יכולים לשמור את התוכן במטמון.

  • max-age — הגדרה של מספר השניות שחלפו מאז התשובה, שאחריהן צריך לבצע אימות מחדש מול שרת המקור. ההגדרה הזו חלה על דפדפנים. אם אין כותרת s-maxage, היא חלה גם על כל שאר מטמוני הנתונים (כולל CDN).

  • s-maxage — מבטל את ההוראה max-age למטמון משותף (כמו CDN). אם ה-CDN מוצא תשובה שגיל שלה גדול מ-s-maxage שניות, הוא יאמת אותה מחדש מול שרת המקור. בכותרת לדוגמה, דפדפנים יכולים לשמור את התגובה במטמון למשך 5 דקות, אבל רשת ה-CDN ומטמונים אחרים יכולים לשמור אותה במטמון למשך 10 דקות.

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

אם רוצים למנוע שמירה במטמון לחלוטין (לדוגמה, כדי להציג תמיד את הגרסה העדכנית ביותר של תוכן סטטי), אפשר להגדיר את זה ב-firebase.json באמצעות ההגדרה headers:

"hosting": {
  // ...

  // Disables caching for the /posts route
  "headers": [ {
    // Change source to match your dynamically-rendered routes
    "source": "/posts/**",
    "headers": [ {
      "key": "Cache-Control",
      "value": "no-cache, no-store"
    } ]
  } ]
}

מידע נוסף על הכותרת Cache-Control זמין ב-Mozilla Developer Network ובמסמכי התיעוד למפתחי אתרים של Google.

מתי מוצג תוכן שמור במטמון?

הדפדפן והמטמון של ה-CDN שומרים את התוכן במטמון על סמך:

  • שם המארח
  • הנתיב
  • מחרוזת השאילתה
  • התוכן של כותרות הבקשה שצוינו בכותרת Vary

שינוי כותרות

הכותרת Vary קובעת באילו כותרות של בקשות צריך להשתמש כדי לספק תגובה מתאימה (אם התוכן שנשמר במטמון תקף או אם צריך לאמת מחדש את התוכן מול השרת המקורי).

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

res.set('Vary', 'Accept-Encoding, X-My-Custom-Header');

במקרה כזה, הערך של הכותרת Vary הוא:

vary: X-My-Custom-Header, x-fh-requested-host, accept-encoding, cookie, authorization

עם ההגדרות האלה, שתי בקשות זהות עם כותרות שונות של X-My-Custom-Header נשמרות במטמון בנפרד. שימו לב ש-Hosting מוסיף את Cookie ואת Authorization לכותרת Vary כברירת מחדל כשמתבצעת בקשה לתוכן דינמי. כך אפשר לוודא שכל כותרת הרשאה של סשן או קובץ Cookie שבה אתם משתמשים היא חלק ממפתח המטמון, וכך למנוע דליפות תוכן מקריות.

חשוב לזכור:

  • אפשר לשמור במטמון רק בקשות מסוג GET ו-HEAD. בקשות HTTPS שנעשה בהן שימוש בשיטות אחרות אף פעם לא נשמרות במטמון.

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

שימוש בקובצי Cookie

כשמשתמשים ב-Firebase Hosting יחד עם Cloud Functions או Cloud Run, קובצי Cookie בדרך כלל מוסרים מבקשות נכנסות. ההגדרה הזו נדרשת כדי לאפשר התנהגות מטמון יעילה ב-CDN. רק קובץ ה-Cookie שנקרא __session מורשה לעבור אל הביצוע של האפליקציה.

אם קובץ ה-Cookie‏ __session קיים, הוא הופך אוטומטית לחלק ממפתח המטמון, כך ששני משתמשים עם קובצי Cookie שונים לא יכולים לקבל את התגובה המאוחסנת במטמון של המשתמש השני. משתמשים בקובץ ה-Cookie ‏__session רק אם האפליקציה מציגה תוכן שונה בהתאם להרשאת המשתמש.