您可以使用自己的网域而非 page.link
子网域,以便更好地控制 Dynamic Links 的品牌塑造。使用自定义网域,您可以创建如下所示的 Dynamic Links:
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 之前的网址部分称为“网址前缀”,包含自定义 Dynamic Link 网域和路径前缀。创建 Dynamic Links 时,您需要提供网址前缀。
设置自定义网域需要 Firebase 项目的 Editor 或 Owner 权限。
将您的网域用于 Dynamic Links
您可以为 Dynamic Links 使用与网页、通用链接和应用链接相同的网域,但这样做必须注意确保您的 Dynamic Link 网址不会与您的网址冲突。如果您将 Dynamic Links 配置为使用特定网址前缀,系统会将以该前缀开头的所有网址都视为 Dynamic Links,因此您不可使用具有该前缀的网址指向普通托管内容。
例如,如果您要创建指向资源 https://example.com/my-resource
(网页、通用链接或应用链接)的 Dynamic Link,不能将 https://example.com/
用作 Dynamic Links 网址前缀,因为这样做会导致 https://example.com/my-resource
被视为 Dynamic Link。相反,您必须使用具有不同网域或不同路径前缀的网址前缀。
因此,以下长 Dynamic Links(和等效短链接)将无法正常工作,因为 link
参数指定的网址以 Dynamic Link 网址前缀 https://example.com/
开头:
https://example.com/?link=https://example.com/my-resource https://example.com/?link=https://example.com/resources/my-resource
但以下长 Dynamic Links(和等效的短链接)可以正常工作,因为网址前缀与 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 控制台中完成自定义网域设置。为此,请执行以下操作:
如果您尚未为项目设置 Firebase Hosting,请打开 Firebase 控制台的“Hosting”页面,点击开始使用,然后按照设置说明依次完成点击。此时,您无需完成指定步骤。
打开 Firebase 控制台的“Dynamic Links”页面。
如果您之前未使用过 Dynamic Links,请点击开始使用。否则,请从下拉菜单中点击添加网址前缀。
然后,完成设置向导,并在出现系统提示时指定要使用的网域和路径前缀。
仅限 iOS:在 Xcode 项目的
Info.plist
文件中,创建一个名为FirebaseDynamicLinksCustomDomains
的键,并将其设置为应用的 Dynamic Links 网址前缀。例如:<key>FirebaseDynamicLinksCustomDomains</key> <array> <string>https://example.com/link</string> <string>https://example.com/promos</string> </array>
手动设置自定义网域
在某些情况下,您必须手动设置自定义网域,例如,如果您已经为 Dynamic Links 设置了自定义网域并希望添加其他网域,或者如果您要添加已关联到 Hosting 站点的网域。
为此,请执行以下操作:
将您的网域关联到 Firebase Hosting(如果您尚未关联)。
使用 Firebase Hosting 设置您的网域,需要在本地项目目录中创建配置文件
firebase.json
。更新到最新版本的 Firebase CLI(v6.5.0 或更高版本)。
在您项目的
firebase.json
文件中为 Dynamic Links 配置 Hosting 站点。如果您的项目有多个站点,请务必配置关联到您要使用的网域的站点。将
appAssociation
设置为AUTO
。设置完成后,Hosting 会在收到相应请求时动态生成assetlinks.json
和apple-app-site-association
文件。将重写规则的
dynamicLinks
设为true
,以指定要用于 Dynamic Links 的路径前缀。对这些路径的请求会被代理到 Dynamic Links。与将路径重写为网址的规则不同,Dynamic Link 重写规则不可包含正则表达式。
如果您的站点有多个重写规则,请注意 Hosting 会执行与相应请求匹配的第一个重写规则。
例如:
"hosting": { // ... "appAssociation": "AUTO", "rewrites": [ { "source": "/promos/**", "dynamicLinks": true }, { "source": "/links/share/**", "dynamicLinks": true } ] }
使用上述配置,您可以创建带有如下网址前缀的 Dynamic Links:
https://your-domain/promos/link-suffix https://your-domain/links/share/link-suffix
如果您仅将此网域用于 Dynamic Links,可以使用源路径
/**
创建不带路径前缀的 Dynamic Links:{ "source": "/**", "dynamicLinks": true }
使用上述规则,您可以创建如下 Dynamic Links:
https://your-domain/link-suffix
部署您的 Hosting 配置更改:
firebase deploy --only hosting
(可选)您可以使用 Hosting REST API 检查已部署的
firebase.json
内容。仅限 iOS:在 Xcode 项目的
Info.plist
文件中,创建一个名为FirebaseDynamicLinksCustomDomains
的键,并将其设置为应用的 Dynamic Links 网址前缀。例如:<key>FirebaseDynamicLinksCustomDomains</key> <array> <string>https://example.com/promos</string> <string>https://example.com/links/share</string> </array>
Dynamic Links 和 Hosting 的优先级顺序
对于 Dynamic Links,请特别注意托管内容的优先级顺序。
- 确保 Dynamic Links 网址前缀不与优先级较高的托管配置冲突(例如,托管的静态内容的优先级始终高于重写内容)。
- 在
rewrites
属性中,Hosting 响应将遵循捕获所请求路径的第一个source
glob 指定的规则。
例如,如果您为 your-domain/source-path/link-suffix
设置了 Dynamic Link,但同时在 your-domain/source-path/index.html
也有静态内容,则静态内容的优先级更高。最终用户看到的将是 index.html
,而非 Dynamic Link。同样,如果您在 your-domain/source-path/link-suffix
有静态内容,则最终用户看到的将是静态内容,而非 Dynamic Link。
如果要为 Dynamic Links 和 Hosting 使用相同的品牌信息,不妨通过下列方法处理 Dynamic Links 网址前缀:
将
source
特性设置为与路径前缀匹配。例如,如果自定义网域为example.com
,则重写规则可以是:// Domain is example.com "rewrites": [ { "source": "/links/**", // Dynamic Links start with "https://example.com/links/" "dynamicLinks": true } ]
设置要用于 Dynamic Links 的子网域,然后将
source
属性设置为与该子网域匹配。例如,如果子网域为links.example.com
,则重写规则可以是:// Domain is links.example.com "rewrites": [ { "source": "/**", // Dynamic Links start with "https://links.example.com/" "dynamicLinks": true } ]