如何把多个站点作为目录映射到一个域名上?

# 域名管理

在 Baklib,我们理解大型企业和业务多元化的客户常常有这样的需求:您可能为不同的产品线、部门或语种创建了多个独立的 Baklib 站点,并希望由不同的团队进行维护。但对外的品牌形象上,您又期望将这些站点统一在一个主域名下,通过不同的目录路径来访问,例如:
  • www.yourcompany.com/product-a/
  • www.yourcompany.com/product-b/
  • www.yourcompany.com/cn/docs/
  • www.yourcompany.com/en/docs/
这样既能保持品牌形象的统一,又能实现内部管理的独立与高效。Baklib 的 “反向代理模式” 功能正是为此而生。本文档将指导您如何配置和使用此功能。

一、 用户场景

假设您的公司(YourCompany)有三个核心产品:Cloud、Studio 和 Fabric。您希望在 Baklib 上为每个产品分别创建帮助中心,并由各自的产品团队独立管理。对外,您不希望使用三个独立的域名(如 cloud-help.com, studio-help.com),而是希望将它们整合到公司的主帮助域名 help.yourcompany.com 下,通过目录进行区分:
  • 访问 help.yourcompany.com/cloud/ 显示 Cloud 产品的帮助中心。
  • 访问 help.yourcompany.com/studio/ 显示 Studio 产品的帮助中心。
  • 访问 help.yourcompany.com/fabric/ 显示 Fabric 产品的帮助中心。
通过反向代理配置,您可以完美实现这一目标。

二、 如何配置与使用

整个配置过程分为两步:在 Baklib 后台获取站点信息,然后在您自己的 Nginx 服务器上进行配置。

步骤 1:在 Baklib 后台获取配置信息

对于每一个需要通过目录访问的站点,您都需要独立完成以下操作来获取其专属配置信息。
  1. 导航至域名管理 进入目标站点的 Baklib 后台,在左侧菜单栏依次点击 “应用设置” -> “域名管理”
  2. 绑定一个内部识别域名
    • 点击 “绑定域名” 按钮。
    • 在弹出的输入框中,您需要为当前站点设置一个仅用于内部识别的域名。这个域名的作用是作为您 Nginx 配置中的 Host 标识,来告诉 Baklib 您想请求哪个具体站点。
    • 强烈推荐使用 .local 作为后缀,以确保它不会与任何真实的公共域名冲突。
    • 格式建议产品名.公司名.local
    • 示例:假设您的产品是 Cloud,公司是 YourCompany,您可以填写 cloud.yourcompany.local
  3. 切换至反向代理模式并获取参数
    • 域名绑定成功后,在列表中找到您刚刚添加的 .local 域名,点击其右侧的 “配置” 按钮。
    • 在弹出的窗口中,将“部署模式”切换为 “反向代理模式”
    • 切换后,界面将展示 Nginx 配置所需的全部关键信息。请记录或复制它们,以备下一步使用:
      • 入口域名:这是您站点被访问的真实域名,非常重要。例如,填写 help.yourcompany.com
      • 部署路径 :如果您希望站点在域名的某个子目录下访问(如 /app),请填写此项。如果站点直接在根目录,请留空。注意: 路径不能以 / 结尾。例如,填写/cloud
      • Token:这是一个安全凭证,用于验证请求的合法性。请妥善保管,并将其配置到 Nginx 中。
对您的每一个产品站点(如 Cloud, Studio, Fabric 等)重复以上步骤,即可获得所有站点的独立配置信息。如 Nginx 配置示例
    # Nginx 配置示例, 实现用户访问 help.yourcompany.com/cloud 等于访问 cloud.yourcompany.local
    # 通过此配置可将多个站点统一管理在同一域名的不同目录下
    server {
      listen       80;
      server_name  help.yourcompany.com;
      location /cloud/ {
          rewrite ^/cloud/(.*)$ /$1 break;
          proxy_pass http://site-7kr1j63g.cname.baklib.site;
          proxy_set_header Host cloud.yourcompany.local;
          # 用于验证自建反向代理的身份, 如果 Token 泄漏可点击上面的重置凭证按钮
          proxy_set_header baklib-x-token 4607d3f686c3f0362fa45f383033a89a;
          proxy_set_header baklib-x-script-name /cloud;
          proxy_set_header baklib-x-forwarded-for $proxy_add_x_forwarded_for;
          proxy_set_header baklib-x-forwarded-host $server_name;
          proxy_set_header baklib-x-forwarded-proto $scheme;
          proxy_set_header baklib-x-forwarded-port $server_port;
      }
    }

步骤 2:配置您自己的 Nginx 服务器

您需要准备一台自己的服务器,并安装好 Nginx。然后,编辑 Nginx 的配置文件(通常是 nginx.conf 或在 conf.d 目录下的自定义配置文件),参考以下格式进行配置。
以下是一个完整的配置示例,它实现了将 help.yourcompany.com 域名下的多个目录(/cloud/, /studio/ 等)映射到不同的 Baklib 站点。
server {
    listen 443 ssl http2; # 推荐使用 443 端口和 SSL 加密
    server_name help.yourcompany.com; # 这里填写您自己的主域名

    # SSL 证书配置 (请替换为您自己的证书路径)
    ssl_certificate      cert/yourcompany.com.pem;
    ssl_certificate_key  cert/yourcompany.com.key;
    
    # ... 其他 SSL 和服务器配置 ...

    # === 映射第一个站点:Cloud ===
    # 访问 help.yourcompany.com/cloud/
	location /cloud/ {
		  rewrite ^/cloud/(.*)$ /$1 break;
		  proxy_pass http://site-kr1j63gx.cname.baklib.site;
		  proxy_set_header Host cloud.yourcompany.local;
		  # 用于验证自建反向代理的身份, 如果 Token 泄漏可点击上面的重置凭证按钮
		  proxy_set_header baklib-x-token 4607d3f686c3f0362fa45f383033a89a;
		  proxy_set_header baklib-x-script-name /cloud;
		  proxy_set_header baklib-x-forwarded-for $proxy_add_x_forwarded_for;
		  proxy_set_header baklib-x-forwarded-host $server_name;
		  proxy_set_header baklib-x-forwarded-proto $scheme;
		  proxy_set_header baklib-x-forwarded-port $server_port;
	}

    # === 映射第二个站点:Studio ===
    # 访问 help.yourcompany.com/studio/
    location /studio/ {
		  rewrite ^/studio/(.*)$ /$1 break;
		  proxy_pass http://site-7kr2j63g.cname.baklib.site;
		  proxy_set_header Host studio.yourcompany.local;
		  # 用于验证自建反向代理的身份, 如果 Token 泄漏可点击上面的重置凭证按钮
		  proxy_set_header baklib-x-token a1e9335164d214aee1f224d0f432c9f9;
		  proxy_set_header baklib-x-script-name /studio;
		  proxy_set_header baklib-x-forwarded-for $proxy_add_x_forwarded_for;
		  proxy_set_header baklib-x-forwarded-host $server_name;
		  proxy_set_header baklib-x-forwarded-proto $scheme;
		  proxy_set_header baklib-x-forwarded-port $server_port;
    }
    # ... 您可以根据需要,添加任意多个 location 块来映射更多站点 ...
}
关键配置说明:
  • server_name: 填写您对外展示的主域名
  • location /path/: 定义一个目录路径。当用户访问这个路径时,该 location 块内的规则生效。
  • proxy_pass: 必须填写对应 Baklib 站点后台提供的CNAME地址
  • proxy_set_header Host: 必须填写对应 Baklib 站点后台绑定的以 .local结尾的域名
  • proxy_set_header baklib-x-token: 必须填写对应 Baklib 站点后台生成的 Token
  • proxy_set_header baklib-x-script-name: 必须填写,并且值与 location 的路径保持一致,这能确保站点内的链接(如CSS、JS文件)生成正确。
配置完成后,保存文件并重新加载或重启 Nginx 服务。现在,您就可以通过 help.yourcompany.com/cloud/ 来访问您的 Cloud 产品站点。

三、 实现原理

这个功能的实现原理是基于 Nginx 的反向代理(Reverse Proxy) 机制。
您可以将您的 Nginx 服务器想象成一个智能的“总前台”或“交通枢纽”。
  1. 用户请求:当一个用户在浏览器输入 https://help.yourcompany.com/cloud/ 时,这个请求首先到达的是您的 Nginx 服务器。
  2. 路径匹配:Nginx 服务器作为“总前台”,查看请求的路径是 /cloud/。它会在自己的规则手册(配置文件)里查找,发现有一个 location /cloud/ 的规则与之匹配。
  3. 请求转发:匹配成功后,Nginx 并不会自己处理这个请求,而是扮演代理的角色。它会悄悄地将这个请求转发给规则中指定的“后台专家”——也就是 Baklib 的服务器(由 proxy_pass 指定)。
  4. 附加信息:在转发请求时,Nginx 会附上几张“便签”(HTTP Headers),告诉 Baklib:
    • “你好,这个请求是想访问 cloud.yourcompany.local 这个站点”(通过 proxy_set_header Host)。
    • “这是我的身份凭证 976d6f...,证明我是合法的请求者”(通过 proxy_set_header baklib-x-token)。
  5. Baklib 处理:Baklib 的服务器收到请求后,会检查这些“便签”。它验证 Token,然后根据 Host 知道用户想要的是 cloud.yourcompany.local 站点的内容,于是将该站点的页面数据准备好。
  6. 返回响应:Baklib 将页面数据返回给 Nginx 服务器。
  7. 最终呈现:Nginx 服务器再将收到的内容原封不动地交给用户的浏览器。
在整个过程中,最终用户始终认为自己访问的是 help.yourcompany.com,他们完全感知不到背后复杂的请求转发和站点路由过程。这既保证了用户体验的统一性,也赋予了您灵活强大的站点管理能力。

总结

提交反馈