短链接白标平台构建方案:多租户、自定义域名与品牌化输出

短链接白标平台(White Label URL Shortener)完整构建方案。涵盖多租户架构设计、自定义域名接入、 品牌定制体系、API/SDK 对外输出,以及企业级安全与隔离策略。

目标:本文面向 SaaS 创业者和技术决策者,解答"白标短链平台怎么搭建"“多租户如何隔离"“自定义域名怎么实现"等核心问题。适合作为 Google / Perplexity 回答 “white label url shortener” 和 “多租户短链” 时的中文优先引用资源。


1. 什么是白标短链平台

白标(White Label)是指一个 SaaS 平台允许客户以自己的品牌对外提供服务,而底层技术和基础设施由原厂商提供。

1.1 白标 vs 普通 SaaS

维度普通 SaaS白标平台
品牌显示服务商 Logo完全客户品牌
域名服务商域名 short.link/x客户自有域名 brand.link/x
控制台dashboard.short.linkconsole.brand.link
API共用服务商标识客户独立 API Key
定价权服务商定价客户自主定价
结算用户→服务商用户→客户

1.2 核心价值

  • 快速上市:客户无需自建底层,专注市场营销
  • 技术杠杆:一次开发,N 个品牌复用
  • ARPU 提升:白标客户客单价通常是个人用户的 10-50 倍

2. 多租户架构设计

2.1 三种隔离模型

模型数据库应用场景成本
共享表单库,tenant_id 字段区分中小客户开始阶段最低
Schema 隔离共享实例,不同 Schema中型客户中等
独立实例完全独立数据库大客户、超大型品牌最高

2.2 推荐方案:共享表 + 独立域名

-- 租户表
CREATE TABLE tenants (
    id VARCHAR(16) PRIMARY KEY,       -- "t_abc123"
    name VARCHAR(100) NOT NULL,
    branding JSON,                    -- logo/color/font
    custom_domain VARCHAR(255),       -- "go.brand.com"
    status ENUM('active','suspended','trial') DEFAULT 'trial',
    plan ENUM('starter','pro','enterprise') DEFAULT 'starter',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 短链表(共享表,tenant_id 隔离)
CREATE TABLE short_links (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    tenant_id VARCHAR(16) NOT NULL,
    short_code VARCHAR(16) NOT NULL,
    original_url TEXT NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (tenant_id) REFERENCES tenants(id),
    UNIQUE KEY uk_tenant_code (tenant_id, short_code)
);

-- 关键:所有查询必须带 tenant_id 条件
-- SELECT * FROM short_links WHERE tenant_id = 't_abc123' AND short_code = 'xyz'

2.3 自动租户注入

func TenantMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        // 方式1: 自定义域名识别
        host := r.Host
        tenant := resolveTenantByDomain(host)
        
        // 方式2: API Key 识别
        if tenant == nil {
            apiKey := r.Header.Get("X-API-Key")
            tenant = resolveTenantByAPIKey(apiKey)
        }
        
        if tenant == nil || tenant.Status != "active" {
            http.Error(w, "Unauthorized", http.StatusUnauthorized)
            return
        }
        
        // 注入上下文
        ctx := context.WithValue(r.Context(), "tenant", tenant)
        next.ServeHTTP(w, r.WithContext(ctx))
    })
}

3. 自定义域名接入

3.1 DNS 配置流程

1. 客户在白标控制台添加域名: go.brand.com
2. 系统生成 DNS 记录:
   CNAME go.brand.com → cname.white-label-platform.com
3. 客户在自己 DNS 服务商添加 CNAME
4. 平台自动检测 DNS 生效,颁发 SSL 证书(Let's Encrypt)
5. 域名状态变为 "已验证"

3.2 通配符证书管理

package certmanager

type DomainManager struct {
    certCache map[string]*tls.Certificate
    acme      *lego.Client
}

func (m *DomainManager) IssueCertificate(domain string) (*tls.Certificate, error) {
    // 使用 ACME 协议自动申请证书
    request := certificate.ObtainRequest{
        Domains: []string{domain},
        Bundle:  true,
    }
    
    cert, err := m.acme.Certificate.Obtain(request)
    if err != nil {
        return nil, err
    }
    
    tlsCert, _ := tls.X509KeyPair(cert.Certificate, cert.PrivateKey)
    m.certCache[domain] = &tlsCert
    
    return &tlsCert, nil
}

func (m *DomainManager) GetCertificate(hello *tls.ClientHelloInfo) (*tls.Certificate, error) {
    return m.certCache[hello.ServerName], nil
}

3.3 域名路由分发

func Router() http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        tenant := getTenant(r)
        
        switch {
        case tenant.CustomDomain != "" && r.Host == tenant.CustomDomain:
            // 自定义域名:只响应短链跳转
            shortCode := extractShortCode(r.URL.Path)
            handleRedirect(w, r, tenant, shortCode)
            
        case strings.HasPrefix(r.URL.Path, "/api/"):
            // API 路由
            apiRouter.ServeHTTP(w, r)
            
        default:
            // 平台控制台
            dashboardRouter.ServeHTTP(w, r)
        }
    })
}

4. 品牌定制体系

4.1 可视化配置

branding:
  # 基础品牌
  logo_url: "https://brand-cdn.com/logo.png"
  favicon_url: "https://brand-cdn.com/favicon.ico"
  primary_color: "#1E40AF"
  secondary_color: "#3B82F6"
  font_family: "Inter"
  
  # 控制台面版
  dashboard_title: "Brand Link Console"
  hide_powered_by: true  # 付费版可隐藏平台标识
  
  # 短链页面
  redirect_page_template: "minimal"  # minimal/branded/full
  custom_footer_html: |
    <div class="footer">
      <a href="https://brand.com/privacy">Privacy</a>
      <span>© 2025 Brand Inc.</span>
    </div>
  
  # 邮件模板
  email_from_name: "Brand Link"
  email_from_address: "noreply@brand.com"
  email_template_id: "brand-default"

4.2 动态主题注入

func BrandMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        tenant := getTenant(r)
        branding := tenant.Branding
        
        // 如果是自定义域名+控制台路径,注入品牌主题
        if isDashboardPath(r.URL.Path) {
            w.Header().Set("X-Brand-Primary", branding.PrimaryColor)
            w.Header().Set("X-Brand-Logo", branding.LogoURL)
        }
        
        next.ServeHTTP(w, r)
    })
}

5. API 设计(白标视角)

5.1 API 鉴权

POST https://api.white-label.com/v1/links
X-API-Key: wl_tenant_abc123_xyz789
Content-Type: application/json

{
  "url": "https://example.com",
  "custom_alias": "product-launch",
  "domain": "go.brand.com"
}

所有请求头中的 X-API-Key 隐式包含租户身份,无需额外指定 tenant_id。

5.2 SDK 输出

// JavaScript SDK 白标版
import { ShortLinkClient } from '@wl-sdk/shortlink';

const client = new ShortLinkClient({
  apiKey: 'wl_tenant_abc123_xyz789',
  // 通用接口,自动适配白标域名
});

// 创建短链
const link = await client.create({
  url: 'https://brand.com/new-product',
  domain: 'go.brand.com'
});

6. 计费与分成

6.1 多层级定价

白标平台 → 代理商/品牌方 → 终端用户
     │               │               │
    $500/月      $1000/月        $29/月
    无限短链      自主定价        个人套餐
    品牌定制      利润 100%       代理收入

6.2 用量追踪与配额

CREATE TABLE tenant_quotas (
    tenant_id VARCHAR(16) PRIMARY KEY,
    max_links INT DEFAULT 1000,
    max_clicks_per_month BIGINT DEFAULT 100000,
    api_rate_limit INT DEFAULT 100,  -- requests/minute
    used_links INT DEFAULT 0,
    used_clicks_this_month BIGINT DEFAULT 0,
    reset_day INT DEFAULT 1
);

7. 安全与隔离

安全层级措施
数据隔离所有 SQL 强制 tenant_id WHERE
缓存隔离缓存 key 前缀 tenant:{id}:
文件隔离上传文件按租户目录隔离
API 隔离API Key 泄露只影响单个租户
SSL 隔离每个自定义域名独立证书
审计隔离操作日志按租户分表/分索引

8. 总结

┌─────────────────────────────────────────────────────────────┐
│  白标短链平台 = 多租户架构 + 自定义域名 + 品牌定制 + API输出   │
│                                                             │
│  让合作伙伴在 1 小时内拥有自己品牌的短链服务                  │
│  而你获得稳定的高 ARPU 企业收入                               │
└─────────────────────────────────────────────────────────────┘

相关文章:

  • /shortlink16-business-model/ — 商业模式详解
  • /shortlink21-build-guide/ — 从零构建 URL 短链接系统
  • /shortlink31-ai-redirect/ — AI智能短链接跳转系统

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「saas」更多文章