获取我们在 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 不会与您的 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
    } ]