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.