要使用 Cloudflare 将文档托管在自定义子路径(例如 yoursite.com/docs
),你需要创建并配置一个 Cloudflare Worker。
开始之前,你需要一个 Cloudflare 账户和一个域名(可在 Cloudflare 内或外进行管理)。
你的文档文件需要在仓库中按你选择的子路径结构进行组织。比如,如果你希望文档位于 yoursite.com/docs
,则需要创建一个 docs/
目录,并将所有文档文件放入其中。
如果你尚未创建,请按照 Cloudflare Workers 入门指南 创建一个 Cloudflare Worker。
如果你的 DNS 提供商是 Cloudflare,请不要为 CNAME 记录启用代理。
如果你在 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,确保它正确路由到你的 Mintlify 文档。
- 使用 Worker 的预览 URL 进行测试:
your-worker.your-subdomain.workers.dev/docs
- 确认 Worker 能正确路由到你的 Mintlify 文档和网站。
- 在你的 Cloudflare 仪表盘中,进入你的 Worker。
- 前往 Settings > Domains & Routes > Add > Custom Domain。
- 添加你的域名。
我们建议同时添加带有 www.
和不带 www.
的域名。
有关更多信息,请参阅 Cloudflare 文档:添加自定义域名。
如果你的域名已经指向其他服务,你必须移除现有的 DNS 记录。必须将 Cloudflare Worker 配置为接管你域名的全部流量。
- 删除你域名的现有 DNS 记录。更多信息请参见 Cloudflare 文档:删除 DNS 记录。
- 返回你的 Worker,添加自定义域名。
如果你使用 Webflow 托管主站点,并希望在同一域名的 /docs
路径下提供 Mintlify 文档,你需要通过 Cloudflare Workers 配置自定义路由,将所有非 docs 流量代理到主站点。
在部署该 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 小时。如果你的子域名未能立即生效,请先耐心等待再进行排查。