Check out what’s new from Firebase at Google I/O 2022. 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 不會與您的 Web URL 衝突。當您將動態鏈接配置為使用特定的 URL 前綴時,以該前綴開頭的所有 URL 都將被視為動態鏈接,因此您不能使用帶有該前綴的 URL 指向普通託管內容。

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

因此,以下長格式動態鏈接(和等效的短鏈接)將無法按預期工作,因為link參數指定的 URL 以動態鏈接 URL 前綴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來指定要用於動態鏈接的路徑前綴。對這些路徑的請求被代理到動態鏈接。

      與重寫 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屬性中,Hosting 響應將遵循捕獲請求路徑的第一個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
    } ]