Freemium SaaS 很快就会遇到一个小但麻烦的问题:每个客户怎么访问自己的空间?
一个用户注册。第二个用户注册。某个团队创建 workspace。然后有客户问:“能不能给我一个更像我们自己的 URL?”
你会开始纠结:
用 path slug?
app.example.com/acme
用 subdomain?
acme.example.com
还是一开始就支持客户自己的 custom domain?
portal.acme.com
答案取决于阶段、品牌需求、隔离需求和你愿意承担多少运营复杂度。
快速回答
早期 freemium SaaS 通常可以先用 slug,除非租户身份、品牌 URL、cookie 边界或未来 custom domain 是产品核心。真正重要的不是第一天选 slug 还是 subdomain,而是把 tenant resolution 集中到一个地方,未来可以从 slug 扩展到 subdomain,再扩展到 custom domain。
决策表
| 模式 | 示例 | 适合什么阶段 | 主要代价 |
|---|---|---|---|
| Path slug | app.example.com/acme | 早期产品、简单 onboarding | 品牌感弱 |
| Subdomain | acme.example.com | 租户身份明显、分享更好看 | 需要 wildcard DNS 和 hostname routing |
| Custom domain | portal.acme.com | B2B 客户、品牌门户 | 需要验证、SSL、生命周期管理 |
为什么早期常常先用 slug
Slug 简单。
它更容易:
- 开发
- 本地测试
- 部署
- debug
- 通过一个 app 处理
- 使用同一套 TLS 配置
- 给早期用户解释
如果你还在验证用户到底要不要这个产品,不要让 tenant URL 架构变成主项目。
什么时候 subdomain 值得做
当租户身份需要体现在 hostname 上时,subdomain 更有吸引力。
比如:
- 客户会公开分享自己的入口
- workspace 需要更清晰的品牌感
- 你希望在进入 app path 前就做 tenant routing
- cookie 或 session 需要更清楚的边界
- 未来要支持 customer-owned domain
- 你想让升级路径更自然:
customer.yourapp.com
Microsoft Azure Architecture Center 在多租户域名设计里提到,域名可以用于区分租户、路由请求到正确基础设施,并提供品牌体验。这也是 subdomain 和 custom domain 在 SaaS 里有价值的根本原因。
最大错误:tenant 解析逻辑写得到处都是
最糟糕的不是先用 slug。
最糟糕的是 tenant 解析散落在各处:
- 一个 helper 解析 path
- 一个 API route 解析 hostname
- 一个 middleware 查数据库
- 一个后台任务假设 tenant ID
- 一个营销页面写死 tenant URL
以后迁移时会很痛。
更好的做法是集中成一个函数:
resolveTenant(request)
它可以先支持:
- 从 path slug 读 tenant。
- 以后从 subdomain 读 tenant。
- 再以后从 custom domain mapping 读 tenant。
应用的其他部分不应该关心用户是从哪种 URL 模式进来的。
Tenant entry 应该记录什么
一旦支持 subdomain 或 custom domain,tenant entry 就不是一条简单路由了,而是一个运营对象。
建议记录:
- tenant ID
- hostname
- target app route
- status
- owner
- verification status
- SSL status
- last seen
- created by
- updated by
- change history
- retirement state
很多团队低估了这部分工作。创建第一个 subdomain 很容易,长期管理成百上千个 tenant entries 才是难点。
Pushulink 目前处于 MVP 阶段,专注于托管子域转发、OpenAPI 自动化、访问统计、权限边界、日志和可追踪操作。
一个实用的演进路线
阶段 1:Path slug
先用:
app.example.com/acme
足够验证产品。
阶段 2:Managed subdomain
再加:
acme.example.com
映射到同一个 tenant ID,不要拆成另一套逻辑。
阶段 3:Custom domain
支持:
portal.acme.com
要有验证、SSL 和 ownership。
阶段 4:Lifecycle 管理
开始追踪:
- active tenants
- paused tenants
- deleted workspaces
- old domains
- 仍有访问的旧入口
- 可以安全 retire 的 entries
这个阶段开始,URL 模式就不只是工程选择,而是运营问题。
FAQ
Subdomain 对 SEO 更好吗?
不一定。SEO 取决于内容策略、可抓取性、canonical 和内链。公开租户页面可能适合 subdomain,但也会增加管理面。
Subdomain 对安全更好吗?
它可以帮助一些隔离模式,例如 cookie 边界。但它不是魔法安全功能,也会带来复杂度。
每个 freemium 用户都要给 subdomain 吗?
不一定。如果大多数免费用户不会公开分享 workspace,slug 可能更适合早期。
第一件事应该设计什么?
先设计 tenant resolution 和 lifecycle states。URL 长什么样可以以后演进。