From 8e0229db62e389e8c8c5f157d34f05bdb1fd78e5 Mon Sep 17 00:00:00 2001 From: Ben Fornefeld Date: Tue, 7 Oct 2025 18:40:58 +0200 Subject: [PATCH 01/15] refactor: docs rewrite config --- src/configs/rewrites.ts | 5 +++++ tsconfig.json | 22 +++++++++++++++++----- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/configs/rewrites.ts b/src/configs/rewrites.ts index 37a2530ee..7752bee63 100644 --- a/src/configs/rewrites.ts +++ b/src/configs/rewrites.ts @@ -2,6 +2,7 @@ import { DomainConfig } from '@/types/rewrites.types' export const LANDING_PAGE_DOMAIN = 'www.e2b-landing-page.com' export const DOCS_NEXT_DOMAIN = 'e2b-docs.vercel.app' +export const STAGING_DOCS_NEXT_DOMAIN = 'docs.e2b-staging.dev' // Currently we have two locations for rewrites to happen. @@ -40,6 +41,10 @@ export const ROUTE_REWRITE_CONFIG: DomainConfig[] = [ export const MIDDLEWARE_REWRITE_CONFIG: DomainConfig[] = [ { domain: DOCS_NEXT_DOMAIN, + rules: [{ path: '/docs/sdk-reference' }], + }, + { + domain: STAGING_DOCS_NEXT_DOMAIN, rules: [{ path: '/docs' }], }, ] diff --git a/tsconfig.json b/tsconfig.json index db7d5f71a..1f5c78aa7 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,11 @@ { "compilerOptions": { "target": "ES2020", - "lib": ["dom", "dom.iterable", "esnext"], + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], "allowJs": true, "skipLibCheck": true, "strict": true, @@ -12,7 +16,7 @@ "moduleResolution": "bundler", "noUncheckedIndexedAccess": true, "resolveJsonModule": true, - "jsx": "react-jsx", + "jsx": "preserve", "incremental": true, "plugins": [ { @@ -20,10 +24,18 @@ } ], "paths": { - "@/*": ["./src/*"] + "@/*": [ + "./src/*" + ] }, "isolatedModules": true }, - "include": ["next-env.d.ts", "src", ".next/types/**/*.ts"], - "exclude": ["node_modules"] + "include": [ + "next-env.d.ts", + "src", + ".next/types/**/*.ts" + ], + "exclude": [ + "node_modules" + ] } From 1ded551811908b92a8ef4cbbfc74d85df8115135 Mon Sep 17 00:00:00 2001 From: Ben Fornefeld Date: Tue, 7 Oct 2025 18:52:01 +0200 Subject: [PATCH 02/15] wip --- next.config.mjs | 8 ++++++++ src/configs/rewrites.ts | 11 +---------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/next.config.mjs b/next.config.mjs index d813236b4..48c303cfb 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -55,6 +55,14 @@ const config = { source: '/ingest/decide', destination: 'https://us.i.posthog.com/decide', }, + { + source: '/docs/sdk-reference/:path*', + destination: 'https://e2b-docs.vercel.app/docs/sdk-reference/:path*', + }, + { + source: '/docs/:path*', + destination: 'https://docs.e2b-staging.dev/:path*', + } ], redirects: async () => [ { diff --git a/src/configs/rewrites.ts b/src/configs/rewrites.ts index 7752bee63..5197f7513 100644 --- a/src/configs/rewrites.ts +++ b/src/configs/rewrites.ts @@ -38,13 +38,4 @@ export const ROUTE_REWRITE_CONFIG: DomainConfig[] = [ ] // Middleware native rewrite config -export const MIDDLEWARE_REWRITE_CONFIG: DomainConfig[] = [ - { - domain: DOCS_NEXT_DOMAIN, - rules: [{ path: '/docs/sdk-reference' }], - }, - { - domain: STAGING_DOCS_NEXT_DOMAIN, - rules: [{ path: '/docs' }], - }, -] +export const MIDDLEWARE_REWRITE_CONFIG: DomainConfig[] = [] From 70a921113a2dd059e5e8a519c7727fc62d6a7345 Mon Sep 17 00:00:00 2001 From: Ben Fornefeld Date: Tue, 7 Oct 2025 18:57:20 +0200 Subject: [PATCH 03/15] fix: before files rewrites --- next.config.mjs | 46 ++++++++++++++++++++++++---------------------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/next.config.mjs b/next.config.mjs index 48c303cfb..b76ba2bf7 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -42,28 +42,30 @@ const config = { ], }, ], - rewrites: async () => [ - { - source: '/ingest/static/:path*', - destination: 'https://us-assets.i.posthog.com/static/:path*', - }, - { - source: '/ingest/:path*', - destination: 'https://us.i.posthog.com/:path*', - }, - { - source: '/ingest/decide', - destination: 'https://us.i.posthog.com/decide', - }, - { - source: '/docs/sdk-reference/:path*', - destination: 'https://e2b-docs.vercel.app/docs/sdk-reference/:path*', - }, - { - source: '/docs/:path*', - destination: 'https://docs.e2b-staging.dev/:path*', - } - ], + rewrites: async () => ({ + beforeFiles: [ + { + source: '/ingest/static/:path*', + destination: 'https://us-assets.i.posthog.com/static/:path*', + }, + { + source: '/ingest/:path*', + destination: 'https://us.i.posthog.com/:path*', + }, + { + source: '/ingest/decide', + destination: 'https://us.i.posthog.com/decide', + }, + { + source: '/docs/sdk-reference/:path*', + destination: 'https://e2b-docs.vercel.app/docs/sdk-reference/:path*', + }, + { + source: '/docs/:path*', + destination: 'https://docs.e2b-staging.dev/:path*', + }, + ], + }), redirects: async () => [ { source: '/docs/api/cli', From 8ca0979d7d24a24bfa1cf24f1c9f016f56bc8f05 Mon Sep 17 00:00:00 2001 From: Ben Fornefeld Date: Wed, 8 Oct 2025 12:31:52 +0200 Subject: [PATCH 04/15] test: rewrites via vercel json --- next.config.mjs | 8 -------- src/configs/rewrites.ts | 1 - vercel.json | 19 +++++++++++++++++++ 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/next.config.mjs b/next.config.mjs index b76ba2bf7..610b15579 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -56,14 +56,6 @@ const config = { source: '/ingest/decide', destination: 'https://us.i.posthog.com/decide', }, - { - source: '/docs/sdk-reference/:path*', - destination: 'https://e2b-docs.vercel.app/docs/sdk-reference/:path*', - }, - { - source: '/docs/:path*', - destination: 'https://docs.e2b-staging.dev/:path*', - }, ], }), redirects: async () => [ diff --git a/src/configs/rewrites.ts b/src/configs/rewrites.ts index 5197f7513..bed1310d5 100644 --- a/src/configs/rewrites.ts +++ b/src/configs/rewrites.ts @@ -2,7 +2,6 @@ import { DomainConfig } from '@/types/rewrites.types' export const LANDING_PAGE_DOMAIN = 'www.e2b-landing-page.com' export const DOCS_NEXT_DOMAIN = 'e2b-docs.vercel.app' -export const STAGING_DOCS_NEXT_DOMAIN = 'docs.e2b-staging.dev' // Currently we have two locations for rewrites to happen. diff --git a/vercel.json b/vercel.json index f8577bf41..ee3fea403 100644 --- a/vercel.json +++ b/vercel.json @@ -81,5 +81,24 @@ "destination": "https://e2b.dev/docs/:path*", "permanent": true } + ], + "rewrites": [ + { + "source": "/docs/sdk-reference", + "destination": "https://e2b-docs.vercel.app/docs/sdk-reference" + }, + { + "source": "/docs/sdk-reference/:match*", + "destination": "https://e2b-docs.vercel.app/docs/sdk-reference/:match*" + }, + + { + "source": "/docs", + "destination": "https://docs.e2b-staging.dev" + }, + { + "source": "/docs/:match*", + "destination": "https://docs.e2b-staging.dev/:match*" + } ] } From 32da0af8344227244bedeae763a0580a7903000d Mon Sep 17 00:00:00 2001 From: Ben Fornefeld Date: Wed, 8 Oct 2025 14:02:43 +0200 Subject: [PATCH 05/15] refactor: update rewrite configurations in vercel.json and rewrites.ts --- src/configs/rewrites.ts | 12 +++++++++++- vercel.json | 19 ------------------- 2 files changed, 11 insertions(+), 20 deletions(-) diff --git a/src/configs/rewrites.ts b/src/configs/rewrites.ts index bed1310d5..7752bee63 100644 --- a/src/configs/rewrites.ts +++ b/src/configs/rewrites.ts @@ -2,6 +2,7 @@ import { DomainConfig } from '@/types/rewrites.types' export const LANDING_PAGE_DOMAIN = 'www.e2b-landing-page.com' export const DOCS_NEXT_DOMAIN = 'e2b-docs.vercel.app' +export const STAGING_DOCS_NEXT_DOMAIN = 'docs.e2b-staging.dev' // Currently we have two locations for rewrites to happen. @@ -37,4 +38,13 @@ export const ROUTE_REWRITE_CONFIG: DomainConfig[] = [ ] // Middleware native rewrite config -export const MIDDLEWARE_REWRITE_CONFIG: DomainConfig[] = [] +export const MIDDLEWARE_REWRITE_CONFIG: DomainConfig[] = [ + { + domain: DOCS_NEXT_DOMAIN, + rules: [{ path: '/docs/sdk-reference' }], + }, + { + domain: STAGING_DOCS_NEXT_DOMAIN, + rules: [{ path: '/docs' }], + }, +] diff --git a/vercel.json b/vercel.json index ee3fea403..f8577bf41 100644 --- a/vercel.json +++ b/vercel.json @@ -81,24 +81,5 @@ "destination": "https://e2b.dev/docs/:path*", "permanent": true } - ], - "rewrites": [ - { - "source": "/docs/sdk-reference", - "destination": "https://e2b-docs.vercel.app/docs/sdk-reference" - }, - { - "source": "/docs/sdk-reference/:match*", - "destination": "https://e2b-docs.vercel.app/docs/sdk-reference/:match*" - }, - - { - "source": "/docs", - "destination": "https://docs.e2b-staging.dev" - }, - { - "source": "/docs/:match*", - "destination": "https://docs.e2b-staging.dev/:match*" - } ] } From 9030bfccc72753eec36ccf5a6db7a3c78b1f8934 Mon Sep 17 00:00:00 2001 From: Ben Fornefeld Date: Thu, 9 Oct 2025 10:37:36 +0200 Subject: [PATCH 06/15] fix: asset prefixing --- next.config.mjs | 10 ++++++++++ src/middleware.ts | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/next.config.mjs b/next.config.mjs index 610b15579..576545a6c 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -56,6 +56,16 @@ const config = { source: '/ingest/decide', destination: 'https://us.i.posthog.com/decide', }, + + // Asset rewrites for Mintlify + { + source: '/mintlify-assets/_next/static/:path*', + destination: 'https://docs.e2b-staging.dev/mintlify-assets/_next/static/:path*', + }, + { + source: '/_mintlify/:path*', + destination: 'https://docs.e2b-staging.dev/_mintlify/:path*', + }, ], }), redirects: async () => [ diff --git a/src/middleware.ts b/src/middleware.ts index db1d675c4..7b540b3ca 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -131,6 +131,6 @@ export const config = { * - vercel analytics route * - posthog routes */ - '/((?!_next/static|_next/image|favicon.ico|api/|.*\\.(?:svg|png|jpg|jpeg|gif|webp)$|_vercel/|ingest/).*)', + '/((?!_next/static|_next/image|favicon.ico|api/|.*\\.(?:svg|png|jpg|jpeg|gif|webp)$|_vercel/|ingest/|mintlify-assets/|_mintlify/).*)', ], } From cffdefd5d3ba8e9c7f513a5f0d41ee1252a4426d Mon Sep 17 00:00:00 2001 From: Ben Fornefeld Date: Thu, 9 Oct 2025 10:45:40 +0200 Subject: [PATCH 07/15] change docs domain --- next.config.mjs | 4 ++-- src/configs/rewrites.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/next.config.mjs b/next.config.mjs index 576545a6c..1e9aa1ac4 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -60,11 +60,11 @@ const config = { // Asset rewrites for Mintlify { source: '/mintlify-assets/_next/static/:path*', - destination: 'https://docs.e2b-staging.dev/mintlify-assets/_next/static/:path*', + destination: 'https://e2b-migrate-main-docs.mintlify.app/mintlify-assets/_next/static/:path*', }, { source: '/_mintlify/:path*', - destination: 'https://docs.e2b-staging.dev/_mintlify/:path*', + destination: 'https://e2b-migrate-main-docs.mintlify.app/_mintlify/:path*', }, ], }), diff --git a/src/configs/rewrites.ts b/src/configs/rewrites.ts index 7752bee63..4e42a7431 100644 --- a/src/configs/rewrites.ts +++ b/src/configs/rewrites.ts @@ -2,7 +2,7 @@ import { DomainConfig } from '@/types/rewrites.types' export const LANDING_PAGE_DOMAIN = 'www.e2b-landing-page.com' export const DOCS_NEXT_DOMAIN = 'e2b-docs.vercel.app' -export const STAGING_DOCS_NEXT_DOMAIN = 'docs.e2b-staging.dev' +export const STAGING_DOCS_NEXT_DOMAIN = 'e2b-migrate-main-docs.mintlify.app' // Currently we have two locations for rewrites to happen. From 055fa30ec380ad829756863de40ca4e8d2d41e16 Mon Sep 17 00:00:00 2001 From: Ben Fornefeld Date: Thu, 9 Oct 2025 10:51:23 +0200 Subject: [PATCH 08/15] fix: sitemap --- src/app/sitemap.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/app/sitemap.ts b/src/app/sitemap.ts index caa9b9307..7c0aef56a 100644 --- a/src/app/sitemap.ts +++ b/src/app/sitemap.ts @@ -12,6 +12,7 @@ import { DOCS_NEXT_DOMAIN, LANDING_PAGE_DOMAIN, ROUTE_REWRITE_CONFIG, + STAGING_DOCS_NEXT_DOMAIN, } from '@/configs/rewrites' import { DomainConfig } from '@/types/rewrites.types' import { XMLParser } from 'fast-xml-parser' @@ -61,6 +62,12 @@ const sites: Site[] = [ changeFrequency: 'weekly', baseUrl: 'https://e2b.dev', }, + { + sitemapUrl: `https://${STAGING_DOCS_NEXT_DOMAIN}/sitemap.xml`, + priority: 0.9, + changeFrequency: 'weekly', + baseUrl: 'https://e2b.dev', + }, ] /** From b22bf997c811c92f68313789bcd6ff2bdfbee274 Mon Sep 17 00:00:00 2001 From: Jakub Dobry Date: Fri, 10 Oct 2025 05:31:04 -0700 Subject: [PATCH 09/15] Update DOCS domain --- src/configs/rewrites.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/configs/rewrites.ts b/src/configs/rewrites.ts index 4e42a7431..b6375a02c 100644 --- a/src/configs/rewrites.ts +++ b/src/configs/rewrites.ts @@ -2,7 +2,7 @@ import { DomainConfig } from '@/types/rewrites.types' export const LANDING_PAGE_DOMAIN = 'www.e2b-landing-page.com' export const DOCS_NEXT_DOMAIN = 'e2b-docs.vercel.app' -export const STAGING_DOCS_NEXT_DOMAIN = 'e2b-migrate-main-docs.mintlify.app' +export const STAGING_DOCS_NEXT_DOMAIN = 'e2b-docs.dev' // Currently we have two locations for rewrites to happen. From fa1965acbf61959e411eb1512a4585f4e18cb0bb Mon Sep 17 00:00:00 2001 From: Ben Fornefeld Date: Fri, 10 Oct 2025 14:51:02 +0200 Subject: [PATCH 10/15] chore: add mcp rewrite and comments for clarity --- next.config.mjs | 8 ++++++-- src/app/sitemap.ts | 10 +++++----- src/configs/rewrites.ts | 15 ++++++++++----- 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/next.config.mjs b/next.config.mjs index 0638c0d32..380c33881 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -1,3 +1,6 @@ +// NOTE: related to src/configs/rewrites.ts +export const DOCUMENTATION_DOMAIN = 'e2b-docs.dev' + /** @type {import('next').NextConfig} */ const config = { eslint: { @@ -54,13 +57,14 @@ const config = { }, // Asset rewrites for Mintlify + // NOTE: this domain is also hardcoded in src/configs/rewrites.ts, specifically for required asset rewrites { source: '/mintlify-assets/_next/static/:path*', - destination: 'https://e2b-migrate-main-docs.mintlify.app/mintlify-assets/_next/static/:path*', + destination: `https://${DOCUMENTATION_DOMAIN}/mintlify-assets/_next/static/:path*`, }, { source: '/_mintlify/:path*', - destination: 'https://e2b-migrate-main-docs.mintlify.app/_mintlify/:path*', + destination: `https://${DOCUMENTATION_DOMAIN}/_mintlify/:path*`, }, ], }), diff --git a/src/app/sitemap.ts b/src/app/sitemap.ts index 7c0aef56a..25b8ea1b7 100644 --- a/src/app/sitemap.ts +++ b/src/app/sitemap.ts @@ -9,14 +9,14 @@ import { ALLOW_SEO_INDEXING } from '@/configs/flags' import { - DOCS_NEXT_DOMAIN, LANDING_PAGE_DOMAIN, ROUTE_REWRITE_CONFIG, - STAGING_DOCS_NEXT_DOMAIN, + SDK_REFERENCE_DOMAIN, } from '@/configs/rewrites' import { DomainConfig } from '@/types/rewrites.types' import { XMLParser } from 'fast-xml-parser' import { MetadataRoute } from 'next' +import { DOCUMENTATION_DOMAIN } from '../../next.config.mjs' // Cache the sitemap for 15 minutes (in seconds) const SITEMAP_CACHE_TIME = 15 * 60 @@ -57,13 +57,13 @@ const sites: Site[] = [ baseUrl: 'https://e2b.dev', }, { - sitemapUrl: `https://${DOCS_NEXT_DOMAIN}/sitemap.xml`, - priority: 0.9, + sitemapUrl: `https://${SDK_REFERENCE_DOMAIN}/sitemap.xml`, + priority: 0.7, changeFrequency: 'weekly', baseUrl: 'https://e2b.dev', }, { - sitemapUrl: `https://${STAGING_DOCS_NEXT_DOMAIN}/sitemap.xml`, + sitemapUrl: `https://${DOCUMENTATION_DOMAIN}/sitemap.xml`, priority: 0.9, changeFrequency: 'weekly', baseUrl: 'https://e2b.dev', diff --git a/src/configs/rewrites.ts b/src/configs/rewrites.ts index b6375a02c..ce3e1053b 100644 --- a/src/configs/rewrites.ts +++ b/src/configs/rewrites.ts @@ -1,8 +1,9 @@ import { DomainConfig } from '@/types/rewrites.types' export const LANDING_PAGE_DOMAIN = 'www.e2b-landing-page.com' -export const DOCS_NEXT_DOMAIN = 'e2b-docs.vercel.app' -export const STAGING_DOCS_NEXT_DOMAIN = 'e2b-docs.dev' +export const SDK_REFERENCE_DOMAIN = 'e2b-docs.vercel.app' +// NOTE: DOCUMENTATION_DOMAIN has to be defined in next.config.mjs, such that we are able to use it there +import { DOCUMENTATION_DOMAIN } from '../../next.config.mjs' // Currently we have two locations for rewrites to happen. @@ -38,13 +39,17 @@ export const ROUTE_REWRITE_CONFIG: DomainConfig[] = [ ] // Middleware native rewrite config +// we implemented this custom, instead of the next.config.js rewrites, +// because of cloudflare-nextjs security blockage on cloudflare's side. + +// TODO: re-evaluate if this is still needed export const MIDDLEWARE_REWRITE_CONFIG: DomainConfig[] = [ { - domain: DOCS_NEXT_DOMAIN, + domain: SDK_REFERENCE_DOMAIN, rules: [{ path: '/docs/sdk-reference' }], }, { - domain: STAGING_DOCS_NEXT_DOMAIN, - rules: [{ path: '/docs' }], + domain: DOCUMENTATION_DOMAIN, + rules: [{ path: '/docs' }, { path: '/mcp' }], }, ] From eccc9bcb57227186b9b20cb9d81a5e97204ba0cc Mon Sep 17 00:00:00 2001 From: Ben Fornefeld Date: Fri, 10 Oct 2025 15:07:48 +0200 Subject: [PATCH 11/15] chore: enhance asset rewrites + comments --- next.config.mjs | 5 ++--- src/configs/rewrites.ts | 22 +++++++++++++++++----- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/next.config.mjs b/next.config.mjs index 380c33881..5afc90308 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -57,10 +57,9 @@ const config = { }, // Asset rewrites for Mintlify - // NOTE: this domain is also hardcoded in src/configs/rewrites.ts, specifically for required asset rewrites { - source: '/mintlify-assets/_next/static/:path*', - destination: `https://${DOCUMENTATION_DOMAIN}/mintlify-assets/_next/static/:path*`, + source: '/mintlify-assets/:path*', + destination: `https://${DOCUMENTATION_DOMAIN}/mintlify-assets/:path*`, }, { source: '/_mintlify/:path*', diff --git a/src/configs/rewrites.ts b/src/configs/rewrites.ts index ce3e1053b..26805b7c0 100644 --- a/src/configs/rewrites.ts +++ b/src/configs/rewrites.ts @@ -38,11 +38,23 @@ export const ROUTE_REWRITE_CONFIG: DomainConfig[] = [ }, ] -// Middleware native rewrite config -// we implemented this custom, instead of the next.config.js rewrites, -// because of cloudflare-nextjs security blockage on cloudflare's side. - -// TODO: re-evaluate if this is still needed +/** + * Middleware native rewrite config + * + * We implement rewrites directly in middleware rather than using Next.js's built-in + * `rewrites` configuration in next.config.js due to Cloudflare WAF compatibility issues. + * + * Context: Next.js's native rewrite system seemed to use the `x-middleware-subrequest` header + * internally, which triggered Cloudflare's managed WAF rules designed to mitigate + * CVE-2025-29927 (Next.js authentication bypass vulnerability). This causes legitimate + * rewrite requests to be blocked when the WAF rule is enabled. + * + * By handling rewrites directly in our middleware layer and controlling the headers, we avoid using the internal + * header mechanism and prevent false positives from Cloudflare's security filters. + * + * @see https://developers.cloudflare.com/changelog/2025-03-22-next-js-vulnerability-waf/ + * TODO: Re-evaluate if this workaround is still necessary after Cloudflare updates their WAF rules + */ export const MIDDLEWARE_REWRITE_CONFIG: DomainConfig[] = [ { domain: SDK_REFERENCE_DOMAIN, From d391082dc7ae0622c44c77934508fe893e20e958 Mon Sep 17 00:00:00 2001 From: Jakub Dobry Date: Sun, 12 Oct 2025 21:20:54 +0200 Subject: [PATCH 12/15] add x-robots-tag when seo indexing is allowed --- src/middleware.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/middleware.ts b/src/middleware.ts index e19e6a858..2f49c6f15 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -62,11 +62,17 @@ export async function middleware(request: NextRequest) { headers.set('x-e2b-should-index', '1') } - return NextResponse.rewrite(rewriteUrl, { + const response = NextResponse.rewrite(rewriteUrl, { request: { headers, }, }) + + if (ALLOW_SEO_INDEXING) { + response.headers.set('X-Robots-Tag', 'index, follow') + } + + return response } // Setup response and Supabase client From 018bbed732249c99f042ea9419e5beb510756d12 Mon Sep 17 00:00:00 2001 From: Jakub Dobry Date: Sun, 12 Oct 2025 21:28:00 +0200 Subject: [PATCH 13/15] set X-Robots-Tag only if not set yet --- src/middleware.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/middleware.ts b/src/middleware.ts index 2f49c6f15..c3e49b4e1 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -69,7 +69,9 @@ export async function middleware(request: NextRequest) { }) if (ALLOW_SEO_INDEXING) { - response.headers.set('X-Robots-Tag', 'index, follow') + if (!response.headers.has('X-Robots-Tag')) { + response.headers.set('X-Robots-Tag', 'index, follow') + } } return response From 4233bf5b9fe0ac3459e46d9fce71493ee2535874 Mon Sep 17 00:00:00 2001 From: Jakub Dobry Date: Sun, 12 Oct 2025 21:33:11 +0200 Subject: [PATCH 14/15] Revert "set X-Robots-Tag only if not set yet" This reverts commit 018bbed732249c99f042ea9419e5beb510756d12. --- src/middleware.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/middleware.ts b/src/middleware.ts index c3e49b4e1..2f49c6f15 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -69,9 +69,7 @@ export async function middleware(request: NextRequest) { }) if (ALLOW_SEO_INDEXING) { - if (!response.headers.has('X-Robots-Tag')) { - response.headers.set('X-Robots-Tag', 'index, follow') - } + response.headers.set('X-Robots-Tag', 'index, follow') } return response From 585e94b47a9929c99c96e9e4cbf909a699f24b14 Mon Sep 17 00:00:00 2001 From: ben-fornefeld Date: Mon, 13 Oct 2025 14:55:56 +0200 Subject: [PATCH 15/15] Update documentation domain and enhance SEO control in middleware - Changed DOCUMENTATION_DOMAIN from 'e2b-docs.dev' to 'e2b.mintlify.app'. - Added 'noindex, nofollow' to X-Robots-Tag header when SEO indexing is not allowed. - Updated comments in rewrites configuration for clarity on custom header handling. --- next.config.mjs | 4 ++-- src/configs/rewrites.ts | 19 +++++++++---------- src/middleware.ts | 2 ++ 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/next.config.mjs b/next.config.mjs index 5afc90308..a355fc8ed 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -1,5 +1,5 @@ // NOTE: related to src/configs/rewrites.ts -export const DOCUMENTATION_DOMAIN = 'e2b-docs.dev' +export const DOCUMENTATION_DOMAIN = 'e2b.mintlify.app' /** @type {import('next').NextConfig} */ const config = { @@ -63,7 +63,7 @@ const config = { }, { source: '/_mintlify/:path*', - destination: `https://${DOCUMENTATION_DOMAIN}/_mintlify/:path*`, + destination: `https://${DOCUMENTATION_DOMAIN}/_mintlify/:path*`, }, ], }), diff --git a/src/configs/rewrites.ts b/src/configs/rewrites.ts index 26805b7c0..7cbb0a503 100644 --- a/src/configs/rewrites.ts +++ b/src/configs/rewrites.ts @@ -42,18 +42,17 @@ export const ROUTE_REWRITE_CONFIG: DomainConfig[] = [ * Middleware native rewrite config * * We implement rewrites directly in middleware rather than using Next.js's built-in - * `rewrites` configuration in next.config.js due to Cloudflare WAF compatibility issues. + * `rewrites` configuration in next.config.js because we need to set custom request + * and response headers for these rewritten requests. * - * Context: Next.js's native rewrite system seemed to use the `x-middleware-subrequest` header - * internally, which triggered Cloudflare's managed WAF rules designed to mitigate - * CVE-2025-29927 (Next.js authentication bypass vulnerability). This causes legitimate - * rewrite requests to be blocked when the WAF rule is enabled. + * Specifically, we need to: + * - Add custom headers to the request (e.g., x-e2b-should-index for SEO control) + * - Set custom response headers (e.g., X-Robots-Tag for search engine indexing) + * - Have fine-grained control over the rewrite behavior based on environment variables * - * By handling rewrites directly in our middleware layer and controlling the headers, we avoid using the internal - * header mechanism and prevent false positives from Cloudflare's security filters. - * - * @see https://developers.cloudflare.com/changelog/2025-03-22-next-js-vulnerability-waf/ - * TODO: Re-evaluate if this workaround is still necessary after Cloudflare updates their WAF rules + * Next.js's native rewrite configuration doesn't provide this level of header manipulation + * capability, so we handle these rewrites in our middleware layer where we have full + * control over the request/response cycle. */ export const MIDDLEWARE_REWRITE_CONFIG: DomainConfig[] = [ { diff --git a/src/middleware.ts b/src/middleware.ts index 2f49c6f15..d2a1209a5 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -70,6 +70,8 @@ export async function middleware(request: NextRequest) { if (ALLOW_SEO_INDEXING) { response.headers.set('X-Robots-Tag', 'index, follow') + } else { + response.headers.set('X-Robots-Tag', 'noindex, nofollow') } return response