获取我们在 Firebase 峰会上发布的所有信息,了解 Firebase 可如何帮助您加快应用开发速度并满怀信心地运行应用。了解详情

为动态链接设置自定义域

通过使用您自己的域而不是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设置重写规则,指定要用于动态链接的路径前缀。对这些路径的请求被代理到动态链接。

      与重写 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
    } ]