Naar console

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

您可以使用自己的域名而非 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 项目的编辑者权限或所有者权限。

将您的网域用于动态链接

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

例如,如果您要创建指向资源 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 托管,请打开 Firebase 控制台的托管页面,点击开始,然后按照设置说明依次完成点击。此时,您无需完成指定步骤。

  2. 打开 Firebase 控制台的“动态链接”页面

  3. 如果您之前未使用过动态链接,请点击入门。否则,请从下拉菜单中点击添加网址前缀

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

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

    <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 6.5.0 或更高版本:

    npm install -g firebase-tools

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

    • appAssociation 设置为 AUTO。设置完成后,用户请求 assetlinks.jsonapple-app-site-association 文件时,托管将动态生成相应这些文件。

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

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

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

    例如:

    "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. 部署您的托管配置更改:

    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 属性中,托管响应将遵循第一个捕获请求路径的 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
    } ]