如何把多个站点作为目录映射到一个域名上?
在 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`,他们完全感知不到背后复杂的请求转发和站点路由过程。这既保证了用户体验的统一性,也赋予了您灵活强大的站点管理能力。