Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions docs.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down Expand Up @@ -551,4 +552,4 @@
"publicApiKey": "pk_76a6caa274e800f3ceff0b2bc6b9b9d82ab8"
}
}
}
}
133 changes: 133 additions & 0 deletions guides/reverse-proxy.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
---
title: "Reverse proxy"
description: "Configure a custom reverse proxy to serve your documentation"
---

<Note>
Reverse proxy configurations are only supported for [Custom plans](https://mintlify.com/pricing?ref=reverse-proxy).
</Note>

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/*` | `<your-subdomain>.mintlify.app` | No cache |
| `/.well-known/vercel/*` | `<your-subdomain>.mintlify.app` | No cache |
| `/mintlify-assets/_next/static/*` | `<your-subdomain>.mintlify.app` | Cache enabled |
| `/*` | `<your-subdomain>.mintlify.app` | No cache |
| `/` | `<your-subdomain>.mintlify.app` | No cache |

## Required header configuration

Configure your reverse proxy with these header requirements:

- **Origin**: Contains the target subdomain `<your-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

<Warning>
Ensure that the `Host` header is not forwarded
</Warning>

## Example nginx configuration

Check warning on line 40 in guides/reverse-proxy.mdx

View check run for this annotation

Mintlify / Mintlify Validation (mintlify) - vale-spellcheck

guides/reverse-proxy.mdx#L40

Did you really mean 'nginx'?

```nginx
server {
listen 80;
server_name <your-domain>.com;

# Let's Encrypt verification paths
location ~ ^/\.well-known/acme-challenge/ {
proxy_pass https://<your-subdomain>.mintlify.app;
proxy_set_header Origin <your-subdomain>.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://<your-subdomain>.mintlify.app;
proxy_set_header Origin <your-subdomain>.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://<your-subdomain>.mintlify.app;
proxy_set_header Origin <your-subdomain>.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://<your-subdomain>.mintlify.app;
proxy_set_header Origin <your-subdomain>.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://<your-subdomain>.mintlify.app;
proxy_set_header Origin <your-subdomain>.mintlify.app;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug: Nginx Config Errors: Missing HTTPS, Inconsistent Slashes

The nginx configuration examples have two issues: the Origin header is missing the https:// protocol scheme, which can affect CORS validation and other origin-based security checks. Additionally, proxy_pass URLs show inconsistent trailing slashes, potentially causing unexpected URL rewriting behavior and broken asset paths.

Fix in Cursor Fix in Web

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 `<your-subdomain>.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.