Catch up on highlights from Firebase at Google I/O 2023. Learn more

為動態鏈接設置自定義域

通過使用您自己的域而不是page.link子域,您可以更好地控制動態鏈接的品牌。使用自定義域,您可以創建動態鏈接,如下例所示:

https://example.com/link-suffix
https://example.com/links/promos/link-suffix
https://links.example.com/link-suffix
https://ex.amp.le/link-suffix

link-suffix之前的 URL 部分稱為URL 前綴,其中包含您的自定義動態鏈接域和路徑前綴。創建動態鏈接時,您需要提供 URL 前綴。

設置自定義域需要 Firebase 項目的編輯者或所有者權限。

將您的網站域用於動態鏈接

您可以為您的動態鏈接和您的網頁、通用鏈接和應用程序鏈接使用相同的域,但如果這樣做,您必須注意您的動態鏈接網址不要與您的網頁網址衝突。當您將動態鏈接配置為使用特定的 URL 前綴時,所有以該前綴開頭的 URL 都被視為動態鏈接,因此您不能使用具有該前綴的 URL 指向普通的託管內容。

例如,如果您想創建資源https://example.com/my-resource的動態鏈接(網頁、通用鏈接或應用程序鏈接),則不能使用https://example.com/作為動態鏈接 URL 前綴,因為這樣做會導致https://example.com/my-resource被視為動態鏈接。相反,您必須使用具有不同域或不同路徑前綴的 URL 前綴。

因此,以下長格式動態鏈接(和等效的短鏈接)將無法按預期工作,因為link參數指定的網址以動態鏈接網址前綴https://example.com/開頭:

 https://example.com/?link=https://example.com/my-resource
 https://example.com/?link=https://example.com/resources/my-resource

但以下長格式動態鏈接(和等效的短鏈接)可以工作,因為 URL 前綴不會與link URL 衝突:

 https://link.example.com/?link=https://example.com/my-resource
 https://example.com/links/?link=https://example.com/my-resource
 https://ex.amp.le/?link=https://example.com/my-resource

在 Firebase 控制台中設置自定義域

您通常可以在 Firebase 控制台中完全設置自定義域。為此:

  1. 如果您尚未為您的項目設置 Firebase 託管,請打開 Firebase 控制台的託管頁面,點擊開始,然後點擊設置說明。此時您不必完成指示的步驟。

  2. 打開 Firebase 控制台的動態鏈接頁面

  3. 如果您以前沒有使用過動態鏈接,請點擊開始使用。否則,請從下拉菜單中單擊添加 URL 前綴

    然後,完成設置嚮導,在出現提示時指定要使用的域和路徑前綴。

  4. 僅限 iOS :在您的 Xcode 項目的Info.plist文件中,創建一個名為FirebaseDynamicLinksCustomDomains的鍵並將其設置為您應用的動態鏈接 URL 前綴。例如:

    <key>FirebaseDynamicLinksCustomDomains</key>
    <array>
      <string>https://example.com/link</string>
      <string>https://example.com/promos</string>
    </array>
    

手動設置自定義域

在某些情況下,例如當您已經為動態鏈接設置了一個自定義域並想要添加另一個域時,或者當您添加一個已經連接到託管站點的域時,您必須手動設置您的自定義域。

為此:

  1. 將您的域連接到 Firebase 託管(如果您尚未這樣做)。

    使用 Firebase 託管設置域包括在本地項目目錄中創建配置文件firebase.json

  2. 更新到最新版本的 Firebase CLI (v6.5.0 或更高版本)。

  3. 在項目的firebase.json文件中為動態鏈接配置託管站點。如果您的項目有多個站點,請務必配置連接到您要使用的域的站點。

    • appAssociation設置為AUTO 。使用此設置,Hosting 在請求時動態生成assetlinks.jsonapple-app-site-association文件。

    • 通過將 dynamicLinks 設置為true設置重寫規則,指定要用於dynamicLinks的路徑前綴。對這些路徑的請求被代理到動態鏈接。

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

      如果您的站點有多個重寫規則,請注意 Hosting 會執行與請求匹配的第一個重寫規則。

    例如:

    "hosting": {
      // ...
      "appAssociation": "AUTO",
      "rewrites": [
        {
          "source": "/promos/**",
          "dynamicLinks": true
        },
        {
          "source": "/links/share/**",
          "dynamicLinks": true
        }
      ]
    }
    

    通過以上配置,您可以創建帶有 URL 前綴的動態鏈接,如下例所示:

    https://your-domain/promos/link-suffix
    https://your-domain/links/share/link-suffix
    

    如果您僅將此域用於動態鏈接,則可以使用/**源路徑來創建沒有路徑前綴的動態鏈接:

    {
      "source": "/**",
      "dynamicLinks": true
    }
    

    使用上述規則,您可以創建動態鏈接,如下例所示:

    https://your-domain/link-suffix

  4. 部署您的託管配置更改:

    firebase deploy --only hosting

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

  5. 僅限 iOS :在您的 Xcode 項目的Info.plist文件中,創建一個名為FirebaseDynamicLinksCustomDomains的鍵並將其設置為您應用的動態鏈接 URL 前綴。例如:

    <key>FirebaseDynamicLinksCustomDomains</key>
    <array>
      <string>https://example.com/promos</string>
      <string>https://example.com/links/share</string>
    </array>
    

動態鏈接和託管的優先順序

對於動態鏈接,請特別注意託管優先順序

  • 確保您的動態鏈接 URL 前綴不與更高優先級的託管配置衝突(例如,託管的靜態內容始終優先於重寫)。
  • rewrites屬性中,託管響應將遵守捕獲請求路徑的第一個source glob指定的規則。

例如,如果您為your-domain / source-path / link-suffix設置了動態鏈接,但在your-domain / source-path /index.html也有靜態內容,則靜態內容優先。最終用戶將看到index.html而不是動態鏈接。同樣,如果您在your-domain / source-path / link-suffix有靜態內容,最終用戶將看到靜態內容而不是動態鏈接。

如果您想對動態鏈接和託管使用相同的品牌,請考慮為您的動態鏈接 URL 前綴選擇以下選項之一:

  • 設置source屬性以匹配路徑前綴。例如,如果您有一個自定義域example.com ,您的重寫規則可以是:

    // Domain is example.com
    "rewrites": [ {
      "source": "/links/**",  // Dynamic Links start with "https://example.com/links/"
      "dynamicLinks": true
    } ]
    
  • 設置一個用於動態鏈接的子域,然後設置您的source屬性以匹配該子域。例如,如果您有links.example.com的子域,您的重寫規則可以是:

    // Domain is links.example.com
    "rewrites": [ {
      "source": "/**",  // Dynamic Links start with "https://links.example.com/"
      "dynamicLinks": true
    } ]