要使用 Cloudflare 将文档托管在自定义子路径(例如 yoursite.com/docs),你需要创建并配置一个 Cloudflare Worker。
开始之前,你需要一个 Cloudflare 账户和一个域名(可在 Cloudflare 内或外进行管理)。

仓库结构

你的文档文件需要在仓库中按你选择的子路径结构进行组织。比如,如果你希望文档位于 yoursite.com/docs,则需要创建一个 docs/ 目录,并将所有文档文件放入其中。

设置 Cloudflare Worker

如果你尚未创建,请按照 Cloudflare Workers 入门指南 创建一个 Cloudflare Worker。
如果你的 DNS 提供商是 Cloudflare,请不要为 CNAME 记录启用代理。

在 Vercel 部署中使用代理

如果你在 Vercel 部署中使用 Cloudflare 作为代理,务必正确配置,以避免与 Vercel 的域名验证和 SSL 证书签发发生冲突。 错误的代理配置可能会使 Vercel 无法为 Let’s Encrypt 配置 SSL 证书,并导致域名验证失败。

必需的路径白名单

你的 Cloudflare Worker 必须允许以下特定路径的流量通过,且不得阻止或重定向:
  • /.well-known/acme-challenge/* - 用于 Let’s Encrypt 证书验证(必需)
  • /.well-known/vercel/* - 用于 Vercel 域名验证(必需)
尽管 Cloudflare 会自动处理许多验证规则,但创建额外的自定义规则可能会无意间阻止这些关键流量。

头部转发要求

请确保在 Worker 配置中正确转发 HOST 头部。未正确转发相关头部将导致验证请求失败。

配置路由

在你的 Cloudflare 控制台中,选择Edit Code,将以下脚本添加到你的 Worker 代码中。更多关于编辑 Worker 的信息,参见 Cloudflare 文档
[SUBDOMAIN] 替换为你的唯一子域名,将 [YOUR_DOMAIN] 替换为你网站的基础 URL;如果需要不同的子路径,将 /docs 替换为你期望的子路径。
addEventListener("fetch", (event) => {
  event.respondWith(handleRequest(event.request));
});

async function handleRequest(request) {
  try {
    const urlObject = new URL(request.url);
    
    // If the request is to a Vercel verification path, allow it to pass through
    if (urlObject.pathname.startsWith('/.well-known/')) {
      return await fetch(request);
    }
    
    // If the request is to the docs subdirectory
    if (/^\/docs/.test(urlObject.pathname)) {
      // Then Proxy to Mintlify
      const DOCS_URL = "[SUBDOMAIN].mintlify.dev";
      const CUSTOM_URL = "[YOUR_DOMAIN]";

      let url = new URL(request.url);
      url.hostname = DOCS_URL;

      let proxyRequest = new Request(url, request);

      proxyRequest.headers.set("Host", DOCS_URL);
      proxyRequest.headers.set("X-Forwarded-Host", CUSTOM_URL);
      proxyRequest.headers.set("X-Forwarded-Proto", "https");
      // If deploying to Vercel, preserve client IP
      proxyRequest.headers.set("CF-Connecting-IP", request.headers.get("CF-Connecting-IP"));

      return await fetch(proxyRequest);
    }
  } catch (error) {
    // If no action found, play the regular request
    return await fetch(request);
  }
}
选择Deploy,并等待更改生效并传播。
配置 DNS 后,自定义子域名通常会在几分钟内生效。DNS 传播有时可能需要 1–4 小时,极少数情况下最多可达 48 小时。如果你的子域名未能立即生效,请先耐心等待再进行排查。

测试你的 Worker

代码部署完成后,测试你的 Worker,确保它正确路由到你的 Mintlify 文档。
  1. 使用 Worker 的预览 URL 进行测试:your-worker.your-subdomain.workers.dev/docs
  2. 确认 Worker 能正确路由到你的 Mintlify 文档和网站。

添加自定义域名

  1. 在你的 Cloudflare 仪表盘中,进入你的 Worker。
  2. 前往 Settings > Domains & Routes > Add > Custom Domain
  3. 添加你的域名。
我们建议同时添加带有 www. 和不带 www. 的域名。
有关更多信息,请参阅 Cloudflare 文档:添加自定义域名

解决 DNS 冲突

如果你的域名已经指向其他服务,你必须移除现有的 DNS 记录。必须将 Cloudflare Worker 配置为接管你域名的全部流量。
  1. 删除你域名的现有 DNS 记录。更多信息请参见 Cloudflare 文档:删除 DNS 记录
  2. 返回你的 Worker,添加自定义域名。

Webflow 自定义路由

如果你使用 Webflow 托管主站点,并希望在同一域名的 /docs 路径下提供 Mintlify 文档,你需要通过 Cloudflare Workers 配置自定义路由,将所有非 docs 流量代理到主站点。
在部署该 Worker 之前,先将你的主站点设置为一个着陆页,否则访问主站点的访客会遇到错误。
  1. 在 Webflow 中为主站点设置一个着陆页,例如 landing.yoursite.com。这是访客访问你网站时首先看到的页面。
  2. 将主站点部署到该着陆页。这样可确保在配置 Worker 期间主站点依然可访问。
  3. 为避免冲突,将主站点中的任何绝对 URL 改为相对路径。
  4. 在 Cloudflare 中选择 Edit Code,将以下脚本添加到你的 Worker 代码中。
[SUBDOMAIN] 替换为你的唯一子域名、[YOUR_DOMAIN] 替换为你网站的基础 URL、[LANDING_DOMAIN] 替换为你的着陆页 URL;如果子路径不同,将 /docs 替换为你需要的子路径。
  addEventListener("fetch", (event) => {
  event.respondWith(handleRequest(event.request));
  });
  async function handleRequest(request) {
  try {
    const urlObject = new URL(request.url);
    
    // 如果请求指向 Vercel 验证路径,则允许其直接通过
    if (urlObject.pathname.startsWith('/.well-known/')) {
      return await fetch(request);
    }
    
    // 如果请求指向 docs 子目录
    if (/^\/docs/.test(urlObject.pathname)) {
      // 代理到 Mintlify
      const DOCS_URL = "[SUBDOMAIN].mintlify.dev";
      const CUSTOM_URL = "[YOUR_DOMAIN]";
      let url = new URL(request.url);
      url.hostname = DOCS_URL;
      let proxyRequest = new Request(url, request);
      proxyRequest.headers.set("Host", DOCS_URL);
      proxyRequest.headers.set("X-Forwarded-Host", CUSTOM_URL);
      proxyRequest.headers.set("X-Forwarded-Proto", "https");
      // 如果部署在 Vercel,保留客户端 IP
      proxyRequest.headers.set("CF-Connecting-IP", request.headers.get("CF-Connecting-IP"));
      return await fetch(proxyRequest);
    }
    // 其他请求路由到主站点
    const MAIN_SITE_URL = "[LANDING_DOMAIN]";
    if (MAIN_SITE_URL && MAIN_SITE_URL !== "[LANDING_DOMAIN]") {
      let mainSiteUrl = new URL(request.url);
      mainSiteUrl.hostname = MAIN_SITE_URL;
      return await fetch(mainSiteUrl, {
        method: request.method,
        headers: request.headers,
        body: request.body
      });
    }
  } catch (error) {
    // 如果没有匹配的处理,回源
    return await fetch(request);
  }
  }
  1. 选择 Deploy 并等待更改生效传播。
配置 DNS 后,自定义子域名通常会在几分钟内生效。DNS 传播有时可能需要 1–4 小时,极少数情况下最多可达 48 小时。如果你的子域名未能立即生效,请先耐心等待再进行排查。