为动态链接设置自定义网域

您可以使用自己的网域而非 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 之前的网址部分称为“网址前缀”,包含自定义动态链接网域和路径前缀。创建动态链接时,您需要提供网址前缀。

设置自定义网域需要 Firebase 项目的 Editor 或 Owner 权限。

将您的网域用于动态链接

您可以为动态链接使用与网页、通用链接和应用链接相同的网域,但这样做必须注意确保您的动态链接网址不会与您的网址冲突。如果您将动态链接配置为使用特定网址前缀,系统会将以该前缀开头的所有网址都视为动态链接,因此您不可使用具有该前缀的网址指向普通托管内容。

例如,如果您要创建指向资源 https://example.com/my-resource(网页、通用链接或应用链接)的动态链接,不能将 https://example.com/ 用作动态链接网址前缀,因为这样做会导致 https://example.com/my-resource 被视为动态链接。 相反,您必须使用具有不同网域或不同路径前缀的网址前缀。

因此,以下长动态链接(和等效短链接)将无法正常工作,因为 link 参数指定的网址以动态链接网址前缀 https://example.com/ 开头:

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

但以下长动态链接(和等效的短链接)可以正常工作,因为网址前缀与 link 网址不冲突:

 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 Hosting,请打开 Firebase 控制台的“Hosting”页面,点击开始使用,然后按照设置说明依次完成点击。此时,您无需完成指定步骤。

  2. 打开 Firebase 控制台的“Dynamic Links”页面

  3. 如果您之前未使用过 Dynamic Links,请点击开始使用。否则,请从下拉菜单中点击添加网址前缀

    然后,完成设置向导,并在出现系统提示时指定要使用的网域和路径前缀。

  4. 仅限 iOS:在 Xcode 项目的 Info.plist 文件中,创建一个名为 FirebaseDynamicLinksCustomDomains 的键,并将其设置为应用的动态链接网址前缀。例如:

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

手动设置自定义网域

在某些情况下,您必须手动设置自定义网域,例如,如果您已经为动态链接设置了自定义网域并希望添加其他网域,或者如果您要添加已关联到 Hosting 站点的网域。

为此,请执行以下操作:

  1. 将您的网域关联到 Firebase Hosting(如果您尚未关联)。

    使用 Firebase Hosting 设置您的网域,需要在本地项目目录中创建配置文件 firebase.json

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

  3. 在您项目的 firebase.json 文件中为动态链接配置 Hosting 站点。如果您的项目有多个站点,请务必配置关联到您要使用的网域的站点。

    • appAssociation 设置为 AUTO。设置完成后,Hosting 会在收到相应请求时动态生成 assetlinks.jsonapple-app-site-association 文件。

    • 将重写规则的 dynamicLinks 设为 true,以指定要用于动态链接的路径前缀。对这些路径的请求会被代理到动态链接。

      与将路径重写为网址的规则不同,动态链接重写规则不可包含正则表达式。

      如果您的站点有多个重写规则,请注意 Hosting 会执行与相应请求匹配的第一个重写规则。

    例如:

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

    使用上述配置,您可以创建带有如下网址前缀的动态链接:

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

    如果您仅将此网域用于动态链接,可以使用源路径 /** 创建不带路径前缀的动态链接:

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

    使用上述规则,您可以创建如下动态链接:

    https://your-domain/link-suffix

  4. 部署您的 Hosting 配置更改:

    firebase deploy --only hosting

    (可选)您可以使用 Hosting REST API 检查已部署的 firebase.json 内容。

  5. 仅限 iOS:在 Xcode 项目的 Info.plist 文件中,创建一个名为 FirebaseDynamicLinksCustomDomains 的键,并将其设置为应用的动态链接网址前缀。例如:

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

动态链接和托管内容的优先级顺序

对于动态链接,请特别注意托管内容的优先级顺序

  • 确保动态链接网址前缀不与优先级较高的托管配置冲突(例如,托管的静态内容的优先级始终高于重写内容)。
  • rewrites 特性中,Hosting 响应将遵循捕获所请求路径的第一个 source glob 指定的规则。

例如,如果您为 your-domain/source-path/link-suffix 设置了动态链接,但同时在 your-domain/source-path/index.html 也有静态内容,则静态内容的优先级更高。最终用户看到的将是 index.html,而非动态链接。同样,如果您在 your-domain/source-path/link-suffix 有静态内容,则最终用户看到的将是静态内容,而非动态链接。

如果要为动态链接和托管内容使用相同的品牌信息,不妨通过下列方法处理动态链接网址前缀:

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