Google致力於提高黑人社區的種族平等。 怎麼看。
本頁面由 Cloud Translation API 翻譯而成。
Switch to English

配置託管行為

借助Firebase託管,您可以配置對網站請求的自定義託管行為。

您可以為主機配置什麼?

  • 在本地項目目錄中指定要部署到Firebase Hosting的文件( 了解方法 )。

  • 服務自定義的404 /未找到頁面( 了解方法 )。

  • 為您已移動或刪除的頁面設置redirects了解方法 )。

  • 為以下任何目的設置rewrites

    • 為多個URL顯示相同的內容( 了解方法 )。

    • 提供服務功能或從託管URL訪問Cloud Run容器(了解方法: 函數容器 )。

    • 創建一個自定義域動態鏈接( 了解方法 )。

  • 添加headers以傳遞有關請求或響應的其他信息,例如瀏覽器應如何處理頁面及其內容(身份驗證,緩存,編碼等)( 了解方法 )。

您在哪裡定義託管配置?

您可以在firebase.json文件中定義Firebase託管配置。當您運行firebase init命令時,Firebase會在項目目錄的根目錄下自動創建firebase.json文件。

您可以在此頁面底部找到完整的firebase.json配置示例 (僅覆蓋Firebase託管)。請注意, firebase.json文件還可以包含其他Firebase服務的配置

您可以使用Hosting REST API檢查已部署的firebase.json內容。

託管響應的優先順序

本頁上描述的不同Firebase Hosting配置選項有時可能會重疊。如果存在衝突,託管將使用以下優先級順序確定其響應:

  1. /__/*路徑段開頭的保留名稱空間
  2. 配置的重定向
  3. 完全匹配靜態內容
  4. 配置的重寫
  5. 自定義404頁面
  6. 默認404頁面

指定要部署的文件

默認的firebase.json文件中包含的默認屬性( publicignore定義了應將項目目錄中的哪些文件部署到Firebase項目中。

firebase.json文件中的默認hosting配置如下所示:

 "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屬性指定部署時要忽略的文件。它可以採取的水珠同樣的方式, 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內容添加到該文件中。

如果瀏覽器在您的域或子域上觸發404 Not Found錯誤,則Firebase託管將顯示此自定義404.html頁面的內容。

配置重定向

可選的
如果您移動了頁面,請使用URL重定向來防止鏈接斷開或縮短URL。例如,您可以將瀏覽器從example.com/team重定向到example.com/about.html

通過創建包含對像數組的redirects屬性來指定URL重定向(稱為“重定向規則”)。在每個規則中,指定一個URL模式,如果該模式與請求URL路徑匹配,則會觸發Hosting以重定向到指定目標URL的方式進行響應。

這是redirects屬性的基本結構。本示例通過向/bar發出新請求將請求重定向到/foo

 "hosting": {
  // ...

  // Returns a permanent redirect to "/bar" for requests to "/foo" (but not "/foo/**")
  "redirects": [ {
    "source": "/foo",
    "destination": "/bar",
    "type": 301
  } ]
}
 

redirects屬性包含一個重定向規則數組,其中每個規則必須包含下表中的字段。

Firebase Hosting會在每個請求開始時將sourceregex值與所有URL路徑進行比較(在瀏覽器確定該路徑上是否存在文件或文件夾之前)。如果找到匹配項,則Firebase託管源服務器將發送HTTP重定向響應,告訴瀏覽器在destination URL處發出新請求。

領域描述
redirects
source (推薦)
regex

URL模式,如果與初始請求URL匹配,則會觸發Hosting應用重定向

destination

瀏覽器應在其中發出新請求的靜態URL

該URL可以是相對路徑,也可以是絕對路徑。

type

HTTP響應代碼

  • 301類型用於“永久移動”
  • 302類型用於“找到”(臨時重定向)

捕獲URL段以進行重定向

可選的
有時,您可能需要捕獲重定向規則的URL模式的特定段( sourceregex值),然後在規則的destination路徑中重新使用這些段。

配置重寫

可選的
使用重寫為多個URL顯示相同的內容。重寫對於模式匹配特別有用,因為您可以接受任何與模式匹配的URL,並讓客戶端代碼決定要顯示的內容。

您還可以使用重寫來支持使用HTML5 pushState進行導航的應用程序。當瀏覽器嘗試打開與指定的sourceregex URL模式匹配的URL路徑時,將在destination URL處為瀏覽器提供文件內容。

通過創建包含對像數組的rewrites屬性(稱為“重寫規則”)來指定URL重寫。在每個規則中,指定一個URL模式,如果該模式與請求URL路徑匹配,則將觸發Hosting響應,就好像該服務已獲得指定的目標URL。

這是rewrites屬性的基本結構。本示例將index.html用於請求不存在的文件或目錄。

 "hosting": {
  // ...

  // Serves index.html for requests to files or directories that do not exist
  "rewrites": [ {
    "source": "**",
    "destination": "/index.html"
  } ]
}
 

rewrites屬性包含一個重寫規則數組,其中每個規則必須包括下表中的字段。

如果在與指定sourceregex URL模式匹配的URL路徑中不存在文件或目錄,Firebase Hosting僅應用重寫規則。當請求觸發重寫規則時,瀏覽器將返回指定destination文件的實際內容,而不是HTTP重定向。

領域描述
rewrites
source (推薦)
regex

URL模式,如果與初始請求URL匹配,則會觸發Hosting應用重寫

destination

必須存在的本地文件

該URL可以是相對路徑,也可以是絕對路徑。

直接請求功能

您可以使用rewrites從Firebase託管URL提供功能。以下示例是使用Cloud Functions提供動態內容的摘錄。

例如,要引導託管站點上/bigben頁上的所有請求以執行bigben函數:

 "hosting": {
  // ...

  // Directs all requests from the page `/bigben` to execute the `bigben` function
  "rewrites": [ {
    "source": "/bigben",
    "function": "bigben"
  } ]
}
 

添加此重寫規則並部署到Firebase(使用firebase deploy )後,可以通過以下URL來訪問您的功能:

  • 您的Firebase子域:
    PROJECT_ID .web.app/bigbenPROJECT_ID .firebaseapp.com/bigben

  • 任何連接的自定義域
    CUSTOM_DOMAIN /bigben

將請求直接發送到Cloud Run容器

您可以使用rewrites從Firebase託管URL訪問Cloud Run容器。以下示例摘錄自使用Cloud Run提供動態內容

例如,要引導託管站點上/helloworld頁上的所有請求以觸發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/helloworldPROJECT_ID .firebaseapp.com/helloworld

  • 任何連接的自定義域
    CUSTOM_DOMAIN /helloworld

您可以使用rewrites來創建自定義域動態鏈接。請訪問動態鏈接文檔,以獲取有關為動態鏈接設置自定義域的詳細信息。

  • 將自定義域用於動態鏈接

    "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
      } ]
    }
    
  • 指定用於動態鏈接的自定義​​域路徑前綴

    "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
      } ]
    }
    

firebase.json文件中配置動態鏈接需要執行以下操作:

領域描述
appAssociation

必須設置為AUTO

  • 如果您的配置中未包含此屬性,則appAssociation的默認值為AUTO
  • 通過將此屬性設置為AUTO ,託管可以在需要時動態生成assetlinks.jsonapple-app-site-association文件。
rewrites
source

您要用於動態鏈接的路徑

與重寫URL路徑的規則不同,動態鏈接的重寫規則不能包含正則表達式。

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頁面匹配的標題,請使用404.html作為sourceregex值。

(子) headers數組

託管應用於請求路徑的自定義標頭

每個子標題必須包含一個keyvalue (請參閱接下來的兩行)。

key 標頭名稱,例如Cache-Control
value 標頭的值,例如max-age=7200

您可以在“託管”部分中了解有關Cache-Control更多信息,該部分描述了提供動態內容和託管微服務。您還可以了解有關CORS標頭的更多信息。

控制.html擴展名

可選的
cleanUrls屬性使您可以控制URL是否應包含.html擴展名。

如果為true ,則Hosting會自動從上傳的文件URL中刪除.html擴展名。如果在請求中添加了.html擴展名,託管將執行301重定向到同一路徑,但會消除.html擴展名。

以下是通過包含cleanUrls屬性來控制URL中包含.htmlcleanUrls

 "hosting": {
  // ...

  // Drops `.html` from uploaded URLs
  "cleanUrls": true
}
 

控制尾部斜杠

可選的
使用trailingSlash屬性,您可以控制URL是否應包含尾部斜杠。

  • true ,託管將重定向URL以添加尾部斜杠。
  • 如果為false ,則託管將重定向URL以刪除尾部斜杠。
  • 未指定時,主機僅對目錄索引文件使用斜杠(例如, about/index.html )。

這是通過添加trailingSlash屬性來控制尾部斜杠的方法:

 "hosting": {
  // ...

  // Removes trailing slashes from URLs
  "trailingSlash": false
}
 

全球模式匹配

Firebase託管配置選項充分利用了與extglob 匹配glob模式匹配表示法,類似於Git處理gitignore規則和Bower處理ignore規則的方式。 該Wiki頁面是更詳細的參考,但以下是此頁面上使用的示例的說明:

  • firebase.json —僅匹配public目錄根目錄中的firebase.json文件

  • ** -匹配任意子目錄中的任何文件或文件夾

  • * —僅匹配public目錄根目錄中的文件和文件夾

  • **/.* /。*-匹配以開頭的任何文件. (通常是隱藏文件,例如.git文件夾中的文件)位於任意子目錄中

  • **/node_modules/** -匹配在任意子目錄中的任何文件或文件夾node_modules文件夾,其本身可以是在一個任意的子目錄public目錄

  • **/*.@(jpg|jpeg|gif|png) -匹配任意子目錄中以以下任意一個結尾的文件: .jpg.jpeg.gif.png

完整主機配置示例

以下是Firebase託管的完整firebase.json配置示例。請注意, 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",

  }
}