All checks were successful
Deploy blog-frontend / build-and-deploy (push) Successful in 2m10s
70 lines
1.9 KiB
TypeScript
70 lines
1.9 KiB
TypeScript
import { NextRequest, NextResponse } from 'next/server';
|
|
|
|
const LOCAL_HOSTNAMES = new Set(['localhost', '127.0.0.1', '::1']);
|
|
const HSTS_HEADER = 'max-age=31536000; includeSubDomains';
|
|
|
|
const getForwardedProtocol = (request: NextRequest) => {
|
|
const forwardedProtocol = request.headers.get('x-forwarded-proto');
|
|
if (forwardedProtocol) {
|
|
return forwardedProtocol.split(',')[0]?.trim().toLowerCase();
|
|
}
|
|
|
|
return request.nextUrl.protocol.replace(':', '').toLowerCase();
|
|
};
|
|
|
|
const getRequestHost = (request: NextRequest) => {
|
|
const forwardedHost = request.headers.get('x-forwarded-host');
|
|
if (forwardedHost) {
|
|
return forwardedHost.split(',')[0]?.trim();
|
|
}
|
|
|
|
return request.headers.get('host') || request.nextUrl.host;
|
|
};
|
|
|
|
const getHostname = (host: string) => {
|
|
if (host.startsWith('[')) {
|
|
return host.slice(1, host.indexOf(']'));
|
|
}
|
|
|
|
return host.split(':')[0];
|
|
};
|
|
|
|
const getRedirectHost = (host: string) => {
|
|
if (host.startsWith('[')) {
|
|
return host.slice(0, host.indexOf(']') + 1);
|
|
}
|
|
|
|
return getHostname(host);
|
|
};
|
|
|
|
const isLocalRequest = (hostname: string) => {
|
|
return LOCAL_HOSTNAMES.has(hostname) || hostname.endsWith('.localhost');
|
|
};
|
|
|
|
export function proxy(request: NextRequest) {
|
|
const protocol = getForwardedProtocol(request);
|
|
const requestHost = getRequestHost(request);
|
|
const hostname = getHostname(requestHost);
|
|
|
|
if (!isLocalRequest(hostname) && protocol === 'http') {
|
|
const redirectUrl = request.nextUrl.clone();
|
|
redirectUrl.protocol = 'https:';
|
|
redirectUrl.host = getRedirectHost(requestHost);
|
|
redirectUrl.port = '';
|
|
|
|
return NextResponse.redirect(redirectUrl, 301);
|
|
}
|
|
|
|
const response = NextResponse.next();
|
|
|
|
if (!isLocalRequest(hostname)) {
|
|
response.headers.set('Strict-Transport-Security', HSTS_HEADER);
|
|
}
|
|
|
|
return response;
|
|
}
|
|
|
|
export const config = {
|
|
matcher: ['/((?!_next/static|_next/image|favicon.ico).*)'],
|
|
};
|