要在 Cloudflare 上将文档托管到自定义子路径(如 yoursite.com/docs),你需要创建并配置一个 Cloudflare Worker。
开始前,你需要一个 Cloudflare 账户和一个域名(可由 Cloudflare 托管或在其他服务商托管)。
yoursite.com/docs,则需创建一个 docs/ 目录,并将所有文档文件置于其中。
如果你还没有创建,请按照Cloudflare Workers 入门指南创建一个 Cloudflare Worker。
如果你的 DNS 提供商是 Cloudflare,请不要为该 CNAME 记录启用代理。
- /.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);
    
    // 如果请求路径是用于 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);
    }
  } catch (error) {
    // 如果未命中任何规则,则按常规方式处理请求
    return await fetch(request);
  }
}
配置 DNS 后,自定义子域名通常会在几分钟内生效。DNS 传播有时可能需要 1–4 小时,极少数情况下最多可达 48 小时。如果你的子域名未能立即生效,请先耐心等待,再进行排查。
- 使用 Worker 的预览 URL 进行测试:your-worker.your-subdomain.workers.dev/docs
- 确认 Worker 能正确路由到你的 Mintlify 文档和你的网站。
- 在你的 Cloudflare 控制台中,进入你的 Worker。
- 依次前往 Settings > Domains & Routes > Add > Custom Domain。
- 添加你的域名。
建议同时添加带有 www. 和不带 www. 的域名。
- 删除你域名的现有 DNS 记录。更多信息请参阅 Cloudflare 文档:删除 DNS 记录。
- 返回到你的 Worker,并添加你的自定义域名。
如果你使用 Webflow 托管主站,并希望在同一域名下的/docs 提供 Mintlify 文档,你需要通过 Cloudflare Workers 配置自定义路由,将所有非文档流量代理到主站。
在部署该 Worker 之前,请确保你的主站已设置为着陆页,否则访问主站的访客将会遇到错误。
- 在 Webflow 中,为主站设置一个着陆页,例如 landing.yoursite.com。当访客访问你的网站时,会看到此页面。
- 将主站部署到该着陆页。这样可确保在配置 Worker 的同时,主站仍可访问。
- 为避免冲突,将主站中的任何绝对 URL 改为相对路径。
- 在 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);
  }
  }
- 选择 Deploy,并等待更改生效。
配置 DNS 后,自定义子域名通常会在几分钟内生效。DNS 传播有时可能需要 1–4 小时,极少数情况下最多可达 48 小时。如果你的子域名未能立即生效,请先耐心等待,再进行排查。