Skip to content

Commit dd1aaca

Browse files
committed
Add cors middleware
1 parent 5cbed71 commit dd1aaca

File tree

2 files changed

+55
-0
lines changed

2 files changed

+55
-0
lines changed

middleware.ts

+7
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import type { NextRequest } from "next/server";
33
import { loggingMiddleware } from "./middleware/logging";
44
import { metricsMiddleware } from "./middleware/metrics";
55
import { errorMiddleware } from "./middleware/error";
6+
import { corsMiddleware } from "./middleware/cors";
67

78
export const config = {
89
matcher: [
@@ -24,6 +25,12 @@ export async function middleware(request: NextRequest) {
2425
return NextResponse.next();
2526
}
2627

28+
// Apply CORS middleware for API routes
29+
if (request.nextUrl.pathname.startsWith("/api/")) {
30+
const corsResponse = corsMiddleware(request);
31+
if (corsResponse) return corsResponse;
32+
}
33+
2734
// Apply logging middleware
2835
const loggedResponse = await loggingMiddleware(request);
2936
if (loggedResponse) return loggedResponse;

middleware/cors.ts

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import { NextResponse } from "next/server";
2+
import type { NextRequest } from "next/server";
3+
4+
export function corsMiddleware(request: NextRequest) {
5+
// Get the origin from the request headers
6+
const origin = request.headers.get("origin") || "";
7+
8+
// Define allowed origins
9+
const allowedOrigins = [
10+
"http://localhost:3000",
11+
"http://localhost:3001",
12+
// Add your production domains here
13+
process.env.NEXT_PUBLIC_APP_URL,
14+
].filter(Boolean);
15+
16+
// Check if the origin is allowed
17+
const isAllowedOrigin = allowedOrigins.includes(origin);
18+
19+
// Handle OPTIONS (preflight) requests
20+
if (request.method === "OPTIONS") {
21+
return new NextResponse(null, {
22+
status: 204,
23+
headers: {
24+
"Access-Control-Allow-Origin": isAllowedOrigin ? origin : allowedOrigins[0],
25+
"Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, OPTIONS",
26+
"Access-Control-Allow-Headers": "Content-Type, Authorization",
27+
"Access-Control-Max-Age": "86400",
28+
},
29+
});
30+
}
31+
32+
// Handle actual requests
33+
const response = NextResponse.next();
34+
35+
// Add CORS headers
36+
response.headers.set(
37+
"Access-Control-Allow-Origin",
38+
isAllowedOrigin ? origin : allowedOrigins[0],
39+
);
40+
response.headers.set("Access-Control-Allow-Credentials", "true");
41+
response.headers.set(
42+
"Access-Control-Allow-Methods",
43+
"GET, POST, PUT, DELETE, OPTIONS",
44+
);
45+
response.headers.set("Access-Control-Allow-Headers", "Content-Type, Authorization");
46+
47+
return response;
48+
}

0 commit comments

Comments
 (0)