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

# 域名管理

在 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
    # 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 站点。

```nginx
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`,他们完全感知不到背后复杂的请求转发和站点路由过程。这既保证了用户体验的统一性,也赋予了您灵活强大的站点管理能力。

总结

提交反馈