diff --git a/packages/next/src/server/lib/router-server.ts b/packages/next/src/server/lib/router-server.ts index 8774e0913f..c725f6d701 100644 --- a/packages/next/src/server/lib/router-server.ts +++ b/packages/next/src/server/lib/router-server.ts @@ -33,6 +33,7 @@ import { PERMANENT_REDIRECT_STATUS, } from '../../shared/lib/constants' import { DevBundlerService } from './dev-bundler-service' +import type { TLSSocket } from 'tls' const debug = setupDebug('next:router-server:main') @@ -222,6 +223,17 @@ export async function initialize(opts: { 'x-middleware-invoke': '', 'x-invoke-path': invokePath, 'x-invoke-query': encodeURIComponent(JSON.stringify(parsedUrl.query)), + 'x-forwarded-host': + req.headers['x-forwarded-host'] ?? req.headers.host ?? opts.hostname, + 'x-forwarded-port': + req.headers['x-forwarded-port'] ?? opts.port.toString(), + 'x-forwarded-proto': + req.headers['x-forwarded-proto'] ?? + (req.socket as TLSSocket).encrypted + ? 'https' + : 'http', + 'x-forwarded-for': + req.headers['x-forwarded-for'] ?? req.socket.remoteAddress, ...(additionalInvokeHeaders || {}), } Object.assign(req.headers, invokeHeaders) diff --git a/test/e2e/app-dir/x-forwarded-headers/app/route.tsx b/test/e2e/app-dir/x-forwarded-headers/app/route.tsx new file mode 100644 index 0000000000..d122485cd4 --- /dev/null +++ b/test/e2e/app-dir/x-forwarded-headers/app/route.tsx @@ -0,0 +1,3 @@ +export function GET(req: Request) { + return Response.json(Object.fromEntries(req.headers)) +} diff --git a/test/e2e/app-dir/x-forwarded-headers/x-forwarded-headers.test.ts b/test/e2e/app-dir/x-forwarded-headers/x-forwarded-headers.test.ts new file mode 100644 index 0000000000..00aca2a918 --- /dev/null +++ b/test/e2e/app-dir/x-forwarded-headers/x-forwarded-headers.test.ts @@ -0,0 +1,13 @@ +import { createNextDescribe } from 'e2e-utils' + +createNextDescribe('x-forwarded-headers', { files: __dirname }, ({ next }) => { + it('should include x-forwarded-* headers', async () => { + const res = await next.fetch('/') + const headers = await res.json() + const url = new URL(next.url) + expect(headers['x-forwarded-host']).toBe(url.host) + expect(headers['x-forwarded-port']).toBe(url.port) + expect(headers['x-forwarded-proto']).toBe(url.protocol.replace(':', '')) + console.log(headers) + }) +})