反向代理设置
反向代理设置
当您将 Fern 文档托管在子路径(如 mydomain.com/docs)上时,您的基础设施必须将该路径的请求代理到 Fern 的源站。子域名设置(docs.mydomain.com)使用 CNAME 记录,不需要反向代理。
工作原理
有效的反向代理需要完成两件事:
- 路由请求:将来自子路径的请求路由到 Fern 源站
app.buildwithfern.com,保留原始路径。x-fern-host头告诉 Fern 要提供哪个文档站点。 - 禁用缓存:禁用 HTML 响应的缓存,确保访客始终收到最新部署的内容。
每个代理请求需要两个头:
Fern 在 HTML 响应上设置 Cache-Control: public, max-age=0, must-revalidate,大多数提供商默认会遵守该设置。如果您的提供商覆盖了源站缓存头或应用了自己的 TTL,请为代理路径显式禁用缓存。
不要缓存来自 Fern 的 HTML 响应。缓存的 HTML 引用旧部署的 JavaScript 和 CSS — 这些文件已不存在,页面将无法加载。静态资源(/_next/static/*)由 Fern 的 CDN 直接提供,不经过您的代理。
配置您的提供商
Cloudflare Workers
AWS CloudFront
添加 Fern 源站
在 CloudFront 分配中,前往 Origins 并创建新源站:
在 Add custom header 下添加:
将 mydomain.com 替换为您的裸域名(不含子路径)。
CloudFront 忽略 CDN-Cache-Control 和 Surrogate-Control — 只读取标准的 Cache-Control 头。如果您使用自定义缓存策略而非 CachingDisabled,请将默认、最小和最大 TTL 设置为 0。非零默认 TTL 会无视 Fern 的 Cache-Control: max-age=0 指令缓存 HTML 响应,可能导致过期内容和错误。
Netlify
为文档路径禁用速率限制
Fern 通过并发请求预热页面缓存来重新验证文档站点。Netlify 的流量规则可能将此视为恶意流量并阻止请求,导致重新验证失败。
如果您在 Netlify 控制台的 Security > Traffic rules 下启用了速率限制,请添加规则将文档子路径(/docs/*)排除在速率限制之外。
检查代理超时
Fern 的重新验证端点在预热页面缓存时流式传输长时间运行的响应。Netlify 将代理重写请求限制为 26 秒,对于超过几百页的站点,这可能在预热完成前终止流。
如果重新验证持续失败并显示”terminated”状态,此超时很可能是原因。请联系 Netlify 支持请求增加站点超时,或联系 Fern 支持获取替代预热方案。
Netlify 的 status = 200 重写充当反向代理 — 访客的浏览器看到的是您的域名,内容来自 Fern。Netlify 遵守源站的 Cache-Control 头,因此不需要额外的缓存配置。
Vercel
Vercel 对重写目标遵守源站的 Cache-Control 头,因此不需要额外的缓存配置。
Nginx
Nginx 不原生支持 Brotli 解压。上面的 Accept-Encoding 覆盖可防止由 Fern 默认 Brotli 压缩响应引起的 HTTP/2 传输错误。
Akamai
验证设置
对您的生产子路径运行以下检查:
如果 content-type 是 text/x-component 而非 text/html,说明您的代理将查看器的 Host 头转发给了 Fern 源站。确保发送给源站的 Host 头是 app.buildwithfern.com。
如果 age 头存在且非零,说明您的代理正在提供缓存的响应。请重新检查提供商配置,确保 HTML 缓存已禁用。