באמצעות Firebase Hosting, אתם יכולים להגדיר התנהגות אירוח בהתאמה אישית לבקשות שנשלחות לאתר שלכם.
אילו הגדרות אפשר לקבוע עבור Hosting?
מציינים אילו קבצים בספריית הפרויקט המקומית רוצים לפרוס ב-Firebase Hosting. כך עושים את זה
הצגת דף 404 או דף 'לא נמצא' בהתאמה אישית. כך עושים את זה
מגדירים
redirectsלדפים שהעברתם או מחקתם. כך עושים את זההגדרת
rewritesלכל אחת מהמטרות הבאות:הצגת אותו תוכן בכמה כתובות URL. איך עושים את זה
הצגת פונקציה או גישה לקונטיינר Cloud Run מכתובת URL Hosting. פונקציה או מאגר תגים
יצירת דומיין מותאם אישית Dynamic Link. כך עושים את זה
מוסיפים
headersכדי להעביר מידע נוסף על בקשה או על תגובה, כמו אופן הטיפול של הדפדפנים בדף ובתוכן שלו (אימות, שמירה במטמון, קידוד וכו'). כך עושים את זההגדרת כתיבה מחדש של בינאום (i18n) כדי להציג תוכן ספציפי על סמך העדפת השפה או המדינה של המשתמש. איך עושים את זה (בדף אחר).
איפה מגדירים את התצורה של Hosting?
מגדירים את התצורה של Firebase Hosting בקובץ firebase.json. מערכת Firebase יוצרת אוטומטית את הקובץ firebase.json בתיקיית הבסיס של הפרויקט כשמריצים את הפקודה firebase init.
בתחתית הדף הזה מופיעה דוגמה מלאה להגדרה של firebase.json (לכיסוי של Firebase Hosting בלבד). שימו לב שקובץ firebase.json יכול להכיל גם הגדרות לשירותים אחרים של Firebase.
אפשר לבדוק את התוכן שנפרס ב-firebase.json באמצעות Hosting REST API.
סדר העדיפות של התשובות של Hosting
יכול להיות שיהיה חפיפה בין אפשרויות ההגדרה השונות של Firebase Hosting שמתוארות בדף הזה. אם יש סתירה, Hosting קובע את התגובה שלו לפי סדר העדיפות הבא:
- מרחבי שמות שמורים שמתחילים בפלח נתיב
/__/* - הפניות שהוגדרו
- תוכן סטטי עם התאמה מדויקת
- שכתובים שהוגדרו
- דף 404 בהתאמה אישית
- דף 404 שמוגדר כברירת מחדל
אם אתם משתמשים בשכתובים של i18n, סדר העדיפויות של הטיפול בהתאמה מדויקת ובשגיאות 404 מתרחב כדי להתאים ל'תוכן i18n'.
מציינים אילו קבצים לפרוס
מאפייני ברירת המחדל – public ו-ignore – שכלולים בקובץ firebase.json שמוגדר כברירת מחדל, מגדירים אילו קבצים בספריית הפרויקט צריכים להיות מופעלים בפרויקט Firebase.
הגדרת ברירת המחדל של hosting בקובץ firebase.json נראית כך:
"hosting": {
"public": "public", // the only required attribute for Hosting
"ignore": [
"firebase.json",
"**/.*",
"**/node_modules/**"
]
}
ציבורי
חובה
המאפיין public מציין את הספרייה שבה יתבצע הפריסה
Firebase Hosting. ערך ברירת המחדל הוא ספרייה בשם public, אבל אפשר לציין כל נתיב של ספרייה, כל עוד היא קיימת בספריית הפרויקט.
השם שמוגדר כברירת מחדל של הספרייה לפריסה הוא:
"hosting": {
"public": "public"
// ...
}
אפשר לשנות את ערך ברירת המחדל לספרייה שרוצים לפרוס:
"hosting": {
"public": "dist/app"
// ...
}
ignore
אופציונלי
המאפיין ignore מציין את הקבצים שצריך להתעלם מהם במהלך הפריסה. אפשר להשתמש בתבניות glob בדיוק כמו ש-Git מטפל ב-.gitignore.
אלה ערכי ברירת המחדל של הקבצים שהמערכת מתעלמת מהם:
"hosting": {
// ...
"ignore": [
"firebase.json", // the Firebase configuration file (the file described on this page)
"**/.*", // files with a leading period should be hidden from the system
"**/node_modules/**" // contains dependencies used to create your site but not run it
]
}
התאמה אישית של דף 404 או דף 'לא נמצא'
אופציונלי
אתם יכולים להציג שגיאת 404 Not Found מותאמת אישית כשמשתמש מנסה לגשת לדף שלא קיים.
יוצרים קובץ חדש בספרייה public של הפרויקט, נותנים לו את השם 404.html, ואז מוסיפים לקובץ את התוכן המותאם אישית של 404 Not Found.
Firebase Hosting יציג את התוכן של הדף המותאם אישית 404.html אם דפדפן יפעיל שגיאת 404 Not Found בדומיין או בתת-הדומיין שלכם.
הגדרת הפניות אוטומטיות
אופציונלי
כדאי להשתמש בהפניה אוטומטית של כתובת URL כדי למנוע קישורים שבורים אם העברתם דף, או כדי לקצר כתובות URL. לדוגמה, אפשר להפנות דפדפן מכתובת example.com/team לכתובת example.com/about.html.
כדי לציין הפניות אוטומטיות של כתובות URL, יוצרים מאפיין redirects שמכיל מערך של אובייקטים (שנקראים 'כללי הפניה אוטומטית'). בכל כלל, מציינים תבנית של כתובת URL שאם היא תתאים לנתיב של כתובת ה-URL של הבקשה, תפעיל את Hosting כדי להגיב בהפניה אוטומטית לכתובת היעד שצוינה.
זהו המבנה הבסיסי של מאפיין redirects. בדוגמה הזו, הבקשות מופנות מחדש אל /foo על ידי יצירת בקשה חדשה אל /bar.
"hosting": {
// ...
// Returns a permanent redirect to "/bar" for requests to "/foo" (but not "/foo/**")
"redirects": [ {
"source": "/foo",
"destination": "/bar",
"type": 301
} ]
}
המאפיין redirects מכיל מערך של כללי הפניה אוטומטית, וכל כלל חייב לכלול את השדות שבטבלה שלמטה.
Firebase Hosting משווה את הערך source או regex לכל נתיבי כתובות ה-URL בתחילת כל בקשה (לפני שהדפדפן קובע אם קיים קובץ או תיקייה בנתיב הזה). אם נמצאה התאמה, שרת המקור Firebase Hosting שולח תגובת הפניה אוטומטית של HTTPS, שמורה לדפדפן לשלוח בקשה חדשה בכתובת ה-URL destination.
| שדה | תיאור | |
|---|---|---|
redirects |
||
source (מומלץ) או regex
|
תבנית של כתובת URL שאם היא תואמת לכתובת ה-URL של הבקשה הראשונית, תפעיל את Hosting כדי להחיל את ההפניה האוטומטית
|
|
destination |
כתובת URL סטטית שבה הדפדפן צריך לשלוח בקשה חדשה כתובת ה-URL יכולה להיות נתיב יחסי או נתיב מוחלט. |
|
type |
קוד תגובת ה-HTTPS
|
|
תיעוד פלחים של כתובות URL להפניות אוטומטיות
אופציונלי
לפעמים צריך לתעד פלחים ספציפיים של תבנית כתובת URL של כלל להפניה אוטומטית (ערך source או regex), ואז להשתמש מחדש בפלחים האלה בנתיב destination של הכלל.
הגדרת כתיבה מחדש
אופציונלי
אפשר להשתמש בשכתוב כדי להציג את אותו התוכן בכמה כתובות URL. שכתובים שימושיים במיוחד בהתאמה לתבנית, כי אפשר לקבל כל כתובת URL שתואמת לתבנית ולאפשר לקוד בצד הלקוח להחליט מה להציג.
אפשר גם להשתמש בשכתובים כדי לתמוך באפליקציות שמשתמשות ב-HTML5 pushState לניווט. כשדפדפן מנסה לפתוח נתיב של כתובת URL שתואם לsource או לregex תבנית כתובת URL שצוינו, הדפדפן יקבל במקום זאת את התוכן של הקובץ בכתובת ה-URL destination.
כדי לציין שינויים בכתובות URL, יוצרים מאפיין rewrites שמכיל מערך של אובייקטים (שנקראים 'כללי שינוי'). בכל כלל, מציינים תבנית של כתובת URL שאם היא תואמת לנתיב של כתובת ה-URL של הבקשה, תפעיל את Hosting כדי להגיב כאילו כתובת היעד שצוינה נמסרה לשירות.
זהו המבנה הבסיסי של מאפיין rewrites. בדוגמה הזו, התוכן index.html מוצג לבקשות לקבצים או לספריות שלא קיימים.
"hosting": {
// ...
// Serves index.html for requests to files or directories that do not exist
"rewrites": [ {
"source": "**",
"destination": "/index.html"
} ]
}
המאפיין rewrites מכיל מערך של כללי שכתוב, וכל כלל חייב לכלול את השדות שבטבלה שלמטה.
Firebase Hosting מחיל כלל שכתוב רק אם קובץ או ספרייה לא קיימים בנתיב URL שתואם לתבנית ה-URL שצוינה source או regex.
כשבקשה מפעילה כלל כתיבה מחדש, הדפדפן מחזיר את התוכן בפועל של קובץ destination שצוין במקום הפניה אוטומטית של HTTP.
| שדה | תיאור | |
|---|---|---|
rewrites |
||
source (מומלץ) או regex
|
תבנית של כתובת URL שאם היא תואמת לכתובת ה-URL של הבקשה הראשונית, תפעיל את Hosting כדי להחיל את השכתוב.
|
|
destination |
קובץ מקומי שחייב להתקיים כתובת ה-URL יכולה להיות נתיב יחסי או נתיב מוחלט. |
|
בקשות ישירות לפונקציה
אפשר להשתמש בפונקציה rewrites כדי להפעיל פונקציה מכתובת URL של Firebase Hosting. הדוגמה הבאה היא קטע מתוך הצגת תוכן דינמי באמצעות Cloud Functions.
לדוגמה, כדי להפנות את כל הבקשות מהדף /bigben באתר שלכם לביצוע הפונקציה bigben:Hosting
"hosting": {
// ...
// Directs all requests from the page `/bigben` to execute the `bigben` function
"rewrites": [ {
"source": "/bigben",
"function": {
"functionId": "bigben",
"region": "us-central1" // optional (see note below)
"pinTag": true // optional (see note below)
}
} ]
}
אחרי שמוסיפים את כלל השכתוב הזה ופורסים אותו ב-Firebase (באמצעות firebase deploy), אפשר להגיע לפונקציה באמצעות כתובות ה-URL הבאות:
תת-הדומיינים שלכם ב-Firebase:
PROJECT_ID.web.app/bigbenו-PROJECT_ID.firebaseapp.com/bigbenדומיינים מותאמים אישית שמקושרים:
CUSTOM_DOMAIN/bigben
כש-Firebase Hosting מעביר תנועה לפונקציה, הפונקציה מקבלת את הנתיב המלא של הבקשה המקורית ואת מחרוזת השאילתה. לדוגמה, בקשה ל-/bigben/hello/world?foo=bar באתר Hosting מועברת לפונקציה עם הנתיב המלא והשאילתה ללא שינוי. חשוב לוודא שפונקציית ה-handler כתובה כך שתטפל בכתובת ה-URL המוחלטת כולה, ולא רק בנתיב הבסיס שמוגדר בשכתוב.
כשמפנים בקשות לפונקציות באמצעות Hosting, שיטות בקשת ה-HTTP הנתמכות הן GET, POST, HEAD, PUT, DELETE, PATCH ו-OPTIONS.
אין תמיכה בשיטות אחרות כמו REPORT או PROFIND.
בקשות ישירות למאגר תגים Cloud Run
אפשר להשתמש ב-rewrites כדי לגשת למאגר תגים Cloud Run מכתובת URL Firebase Hosting. הדוגמה הבאה היא קטע מתוך הצגת תוכן דינמי באמצעות Cloud Run.
לדוגמה, כדי להפנות את כל הבקשות מהדף /helloworld באתר Hosting להפעלת מופע של מאגר תגים helloworld:
"hosting": {
// ...
// Directs all requests from the page `/helloworld` to trigger and run a `helloworld` container
"rewrites": [ {
"source": "/helloworld",
"run": {
"serviceId": "helloworld", // "service name" (from when you deployed the container image)
"region": "us-central1" // optional (if omitted, default is us-central1)
}
} ]
}
אחרי שמוסיפים את כלל הכתיבה מחדש הזה ומבצעים פריסה ל-Firebase (באמצעות firebase deploy), אפשר להגיע לקובץ האימג' בקונטיינר באמצעות כתובות ה-URL הבאות:
תת-הדומיינים שלכם ב-Firebase:
PROJECT_ID.web.app/helloworldו-PROJECT_ID.firebaseapp.com/helloworldדומיינים מותאמים אישית שמקושרים:
CUSTOM_DOMAIN/helloworld
כשמפנים בקשות אל מאגרי Cloud Run באמצעות Hosting, שיטות בקשות ה-HTTP הנתמכות הן GET, POST, HEAD, PUT, DELETE, PATCH ו-OPTIONS. אין תמיכה בשיטות אחרות כמו REPORT או PROFIND.
כדי להשיג את הביצועים הטובים ביותר, כדאי למקם את שירות Cloud Run לצד Hosting באזורים הבאים:
us-west1us-central1us-east1europe-west1asia-east1
אפשר לשכתב מ-Hosting ל-Cloud Run באזורים הבאים:
asia-east1asia-east2asia-northeast1asia-northeast2asia-northeast3asia-south1asia-south2asia-southeast1asia-southeast2australia-southeast1australia-southeast2europe-central2europe-north1europe-southwest1europe-west1europe-west12europe-west2europe-west3europe-west4europe-west6europe-west8europe-west9me-central1me-west1northamerica-northeast1northamerica-northeast2southamerica-east1southamerica-west1us-central1us-east1us-east4us-east5us-south1us-west1us-west2us-west3us-west4us-west1us-central1us-east1europe-west1asia-east1
יצירת דומיין מותאם אישית Dynamic Links
אפשר להשתמש ב-rewrites כדי ליצור דומיין מותאם אישית Dynamic Links. במאמר הגדרת דומיין מותאם אישית ל-Dynamic LinksDynamic Links מופיע מידע מפורט.
שימוש בדומיין המותאם אישית רק עבור Dynamic Links
"hosting": { // ... "appAssociation": "AUTO", // required for Dynamic Links (default is AUTO if not specified) // Add the "rewrites" attribute within "hosting" "rewrites": [ { "source": "/**", // the Dynamic Links start with "https://CUSTOM_DOMAIN/" "dynamicLinks": true } ] }ציון קידומות של נתיבי דומיין מותאמים אישית לשימוש ב-Dynamic Links
"hosting": { // ... "appAssociation": "AUTO", // required for Dynamic Links (default is AUTO if not specified) // Add the "rewrites" attribute within "hosting" "rewrites": [ { "source": "/promos/**", // the Dynamic Links start with "https://CUSTOM_DOMAIN/promos/" "dynamicLinks": true }, { "source": "/links/share/**", // the Dynamic Links start with "https://CUSTOM_DOMAIN/links/share/" "dynamicLinks": true } ] }
כדי להגדיר את Dynamic Links בקובץ firebase.json, צריך:
| שדה | תיאור | |
|---|---|---|
appAssociation |
הערך חייב להיות
|
|
rewrites |
||
source |
נתיב שרוצים להשתמש בו בשביל Dynamic Links בניגוד לכללים שמשנים את הנתיבים לכתובות URL, כללי שינוי של Dynamic Links לא יכולים להכיל ביטויים רגולריים. |
|
dynamicLinks |
הערך חייב להיות true.
|
|
הגדרת כותרות
אופציונלי
כותרות מאפשרות ללקוח ולשרת להעביר מידע נוסף יחד עם בקשה או תגובה. קבוצות מסוימות של כותרות יכולות להשפיע על האופן שבו הדפדפן מטפל בדף ובתוכן שלו, כולל בקרת גישה, אימות, שמירה במטמון וקידוד.
כדי לציין כותרות תגובה מותאמות אישית שספציפיות לקובץ, יוצרים מאפיין headers שמכיל מערך של אובייקטים של כותרות. בכל אובייקט, מציינים תבנית של כתובת URL שאם היא תתאים לנתיב של כתובת ה-URL של הבקשה, תפעיל את Hosting כדי להחיל את כותרות התגובה המותאמות אישית שצוינו.
זהו המבנה הבסיסי של מאפיין headers. בדוגמה הזו מוחלת כותרת CORS על כל קובצי הגופן.
"hosting": {
// ...
// Applies a CORS header for all font files
"headers": [ {
"source": "**/*.@(eot|otf|ttf|ttc|woff|font.css)",
"headers": [ {
"key": "Access-Control-Allow-Origin",
"value": "*"
} ]
} ]
}
המאפיין headers מכיל מערך של הגדרות, וכל הגדרה חייבת לכלול את השדות שבטבלה שלמטה.
| שדה | תיאור | ||
|---|---|---|---|
headers |
|||
source (מומלץ) או regex
|
דפוס של כתובת URL שאם הוא תואם לכתובת ה-URL של הבקשה הראשונית, מפעיל את Hosting כדי להחיל את הכותרת המותאמת אישית.
כדי ליצור כותרת שתתאים לדף 404 בהתאמה אישית, צריך להשתמש ב- |
||
מערך של (תת-)headers |
הכותרות המותאמות אישית ש-Hosting חל על נתיב הבקשה כל כותרת משנה חייבת לכלול צמד של |
||
key |
שם הכותרת, למשל Cache-Control |
||
value |
הערך של הכותרת, לדוגמה max-age=7200 |
||
מידע נוסף על Cache-Control זמין בקטע Hosting שמתאר הצגת תוכן דינמי ואירוח של מיקרו-שירותים. אפשר גם לקרוא מידע נוסף על כותרות CORS.
שליטה בתוספים של .html
אופציונלי
המאפיין cleanUrls מאפשר לכם לקבוע אם כתובות URL צריכות לכלול את התוסף .html.
כשמעלים קובץ עם כתובת URL שכוללת את הסיומת .html, true, Hosting מסירים את הסיומת .html באופן אוטומטי. אם מוסיפים את הסיומת .html בבקשה, Hosting מבצע הפניה אוטומטית מסוג 301 לאותו נתיב, אבל בלי הסיומת .html.
כדי לשלוט בהכללה של .html בכתובות URL, צריך לכלול מאפיין cleanUrls:
"hosting": {
// ...
// Drops `.html` from uploaded URLs
"cleanUrls": true
}
שליטה בלוכסנים בסוף כתובת URL
אופציונלי
המאפיין trailingSlash מאפשר לקבוע אם כתובות URL של תוכן סטטי צריכות לכלול קווים נטויים בסוף.
- כשמפעילים את
true, Hosting מפנה כתובות URL כדי להוסיף קו נטוי בסוף. - כשמשתמשים ב-
false, Hosting כתובות URL מופנות אוטומטית כדי להסיר קו נטוי בסוף. - אם לא מציינים, Hosting משתמש רק בלוכסנים בסוף כתובת URL לקובצי אינדקס של ספריות (לדוגמה,
about/index.html).
כדי לשלוט בלוכסנים בסוף כתובת ה-URL, מוסיפים מאפיין trailingSlash:
"hosting": {
// ...
// Removes trailing slashes from URLs
"trailingSlash": false
}
המאפיין trailingSlash לא משפיע על שינוי תוכן דינמי שמוצג על ידי Cloud Functions או Cloud Run.
התאמה של תבניות Glob
באפשרויות ההגדרה של Firebase Hosting נעשה שימוש נרחב בסימון של התאמת תבניות glob עם extglob, בדומה לאופן שבו Git מטפל בכללי gitignore ולאופן שבו Bower מטפל בכללי ignore.
בדף הוויקי הזה יש הפניה מפורטת יותר, אבל בהמשך מופיעים הסברים לדוגמאות שמופיעות בדף הזה:
firebase.json– תואם רק לקובץfirebase.jsonבספרייה ברמה בסיסית שלpublic
**– תואם לכל קובץ או תיקייה בספריית משנה שרירותית
*– מתאים רק לקבצים ולתיקיות בבסיס של הספרייהpublic
**/.*– תואם לכל קובץ שמתחיל ב-.(בדרך כלל קבצים מוסתרים, כמו בתיקייה.git) בכל תיקיית משנה שרירותית
**/node_modules/**– תואם לכל קובץ או תיקייה בספריית משנה שרירותית של תיקייהnode_modules, שיכולה להיות בעצמה בספריית משנה שרירותית של הספרייהpublic
**/*.@(jpg|jpeg|gif|png)– תואם לכל קובץ בספריית משנה שרירותית שמסתיימת באחד מהסיומים הבאים:.jpg, .jpeg, .gifאו.png
דוגמה להגדרה מלאה של Hosting
זוהי דוגמה מלאה להגדרת firebase.json עבור Firebase Hosting. שימו לב שקובץ firebase.json יכול להכיל גם הגדרות לשירותים אחרים של Firebase.
{
"hosting": {
"public": "dist/app", // "public" is the only required attribute for Hosting
"ignore": [
"firebase.json",
"**/.*",
"**/node_modules/**"
],
"redirects": [ {
"source": "/foo",
"destination": "/bar",
"type": 301
}, {
"source": "/firebase/**",
"destination": "https://www.firebase.com",
"type": 302
} ],
"rewrites": [ {
// Shows the same content for multiple URLs
"source": "/app/**",
"destination": "/app/index.html"
}, {
// Configures a custom domain for Dynamic Links
"source": "/promos/**",
"dynamicLinks": true
}, {
// Directs a request to Cloud Functions
"source": "/bigben",
"function": "bigben"
}, {
// Directs a request to a Cloud Run containerized app
"source": "/helloworld",
"run": {
"serviceId": "helloworld",
"region": "us-central1"
}
} ],
"headers": [ {
"source": "**/*.@(eot|otf|ttf|ttc|woff|font.css)",
"headers": [ {
"key": "Access-Control-Allow-Origin",
"value": "*"
} ]
}, {
"source": "**/*.@(jpg|jpeg|gif|png)",
"headers": [ {
"key": "Cache-Control",
"value": "max-age=7200"
} ]
}, {
"source": "404.html",
"headers": [ {
"key": "Cache-Control",
"value": "max-age=300"
} ]
} ],
"cleanUrls": true,
"trailingSlash": false,
// Required to configure custom domains for Dynamic Links
"appAssociation": "AUTO",
}
}