diff --git a/docs.json b/docs.json
index e364b4726..6d1555857 100644
--- a/docs.json
+++ b/docs.json
@@ -154,17 +154,18 @@
"settings/custom-404-page",
"guides/monorepo",
{
- "group": "Custom Subdirectory",
+ "group": "Custom subdirectory",
"icon": "folder",
"pages": [
"advanced/subpath/cloudflare",
"advanced/subpath/route53-cloudfront",
"advanced/subpath/vercel",
+ "guides/reverse-proxy",
"guides/csp-configuration"
]
},
{
- "group": "Dashboard Access",
+ "group": "Dashboard access",
"icon": "gauge",
"pages": [
"advanced/dashboard/sso",
@@ -551,4 +552,4 @@
"publicApiKey": "pk_76a6caa274e800f3ceff0b2bc6b9b9d82ab8"
}
}
-}
+}
\ No newline at end of file
diff --git a/guides/reverse-proxy.mdx b/guides/reverse-proxy.mdx
new file mode 100644
index 000000000..8b033e68b
--- /dev/null
+++ b/guides/reverse-proxy.mdx
@@ -0,0 +1,133 @@
+---
+title: "Reverse proxy"
+description: "Configure a custom reverse proxy to serve your documentation"
+---
+
+
+ Reverse proxy configurations are only supported for [Custom plans](https://mintlify.com/pricing?ref=reverse-proxy).
+
+
+To serve your documentation through a custom reverse proxy, you must configure routing rules, caching policies, and header forwarding.
+
+When you implement a reverse proxy, monitor for potential issues with domain verification, SSL certificate provisioning, authentication flows, performance, and analytics tracking.
+
+## Routing configuration
+
+Proxy these paths to your Mintlify subdomain with the specified caching policies:
+
+| Path | Destination | Caching |
+|------|-------------|---------|
+| `/.well-known/acme-challenge/*` | `.mintlify.app` | No cache |
+| `/.well-known/vercel/*` | `.mintlify.app` | No cache |
+| `/mintlify-assets/_next/static/*` | `.mintlify.app` | Cache enabled |
+| `/*` | `.mintlify.app` | No cache |
+| `/` | `.mintlify.app` | No cache |
+
+## Required header configuration
+
+Configure your reverse proxy with these header requirements:
+
+- **Origin**: Contains the target subdomain `.mintlify.app`
+- **X-Forwarded-For**: Preserves client IP information
+- **X-Forwarded-Proto**: Preserves original protocol (HTTP/HTTPS)
+- **X-Real-IP**: Forwards the real client IP address
+- **User-Agent**: Forwards the user agent
+
+
+ Ensure that the `Host` header is not forwarded
+
+
+## Example nginx configuration
+
+```nginx
+server {
+ listen 80;
+ server_name .com;
+
+ # Let's Encrypt verification paths
+ location ~ ^/\.well-known/acme-challenge/ {
+ proxy_pass https://.mintlify.app;
+ proxy_set_header Origin .mintlify.app;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header X-Forwarded-Proto $scheme;
+ proxy_set_header User-Agent $http_user_agent;
+
+ # Disable caching for verification paths
+ add_header Cache-Control "no-cache, no-store, must-revalidate";
+ }
+
+ # Vercel verification paths
+ location ~ ^/\.well-known/vercel/ {
+ proxy_pass https://.mintlify.app;
+ proxy_set_header Origin .mintlify.app;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header X-Forwarded-Proto $scheme;
+ proxy_set_header User-Agent $http_user_agent;
+
+ # Disable caching for verification paths
+ add_header Cache-Control "no-cache, no-store, must-revalidate";
+ }
+
+ # Static assets with caching
+ location ~ ^/mintlify-assets/_next/static/ {
+ proxy_pass https://.mintlify.app;
+ proxy_set_header Origin .mintlify.app;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header X-Forwarded-Proto $scheme;
+ proxy_set_header User-Agent $http_user_agent;
+
+ # Enable caching for static assets
+ add_header Cache-Control "public, max-age=86400";
+ }
+
+ # Root path
+ location = / {
+ proxy_pass https://.mintlify.app;
+ proxy_set_header Origin .mintlify.app;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header X-Forwarded-Proto $scheme;
+ proxy_set_header User-Agent $http_user_agent;
+
+ # Disable caching for dynamic content
+ add_header Cache-Control "no-cache, no-store, must-revalidate";
+ }
+
+ # All other documentation paths
+ location / {
+ proxy_pass https://.mintlify.app;
+ proxy_set_header Origin .mintlify.app;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header X-Forwarded-Proto $scheme;
+ proxy_set_header User-Agent $http_user_agent;
+
+ # Disable caching for dynamic content
+ add_header Cache-Control "no-cache, no-store, must-revalidate";
+ }
+}
+```
+
+## Troubleshooting
+
+### 404 error
+
+**Symptoms**: Documentation loads, but features don't work. API calls fail.
+
+**Cause**: `Host` header is being forwarded or `Origin` header is missing.
+
+**Solution**:
+
+- Remove `Host` header forwarding
+- Set `Origin` header to `.mintlify.app`
+
+### Performance issues
+
+**Symptoms**: Slow page loads and layout shifts.
+
+**Cause**: Incorrect caching configuration.
+
+**Solution**: Enable caching only for `/mintlify-assets/_next/static/*` paths.