Files
blog-frontend/src/proxy.ts
wypark 58a012621a
All checks were successful
Deploy blog-frontend / build-and-deploy (push) Successful in 2m10s
.
2026-05-28 19:29:54 +09:00

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).*)'],
};