This commit is contained in:
2026-07-10 21:52:36 +02:00
parent bb528d6ef9
commit 671c1a1559
28 changed files with 6396 additions and 5561 deletions

View File

@@ -40,7 +40,7 @@ function attachAttributionCookie(req: NextRequest, response: NextResponse) {
return response;
}
export function middleware(req: NextRequest) {
const path = req.nextUrl.pathname;
const hostname = req.headers.get('host')?.split(':')[0] || req.nextUrl.hostname;
@@ -72,69 +72,70 @@ export function middleware(req: NextRequest) {
// Public routes that don't require authentication
const publicPaths = [
'/',
'/pricing',
'/faq',
'/blog',
'/login',
'/signup',
'/privacy',
'/',
'/pricing',
'/faq',
'/blog',
'/login',
'/signup',
'/privacy',
'/newsletter',
'/restaurants',
'/tools',
'/features',
// '/guide', // Redirected to /learn/*
'/qr-code-erstellen',
'/dynamic-qr-code-generator',
'/dynamic-barcode-generator',
'/bulk-qr-code-generator',
'/qr-code-tracking',
'/qr-code-analytics',
'/features',
// '/guide', // Redirected to /learn/*
'/de',
'/qr-code-erstellen',
'/dynamic-qr-code-generator',
'/dynamic-barcode-generator',
'/bulk-qr-code-generator',
'/qr-code-tracking',
'/qr-code-analytics',
'/reprint-calculator',
'/custom-qr-code-generator',
'/manage-qr-codes',
'/coupon',
'/feedback',
'/vcard',
'/display',
'/contact',
'/about',
'/learn',
'/use-cases',
'/authors',
'/press',
'/testimonials',
'/qr-code-for-marketing-campaigns',
'/qr-code-for',
'/qr-code-print-size-guide',
'/use-cases/flyer-qr-codes',
'/use-cases/packaging-qr-codes',
'/use-cases/real-estate-sign-qr-codes',
'/use-cases/feedback-qr-codes',
'/use-cases/payment-qr-codes',
'/use-cases/coupon-qr-codes',
'/alternatives',
'/vs',
];
// Check if path is public
const isPublicPath = publicPaths.some(p => path === p || path.startsWith(p + '/'));
'/coupon',
'/feedback',
'/vcard',
'/display',
'/contact',
'/about',
'/learn',
'/use-cases',
'/authors',
'/press',
'/testimonials',
'/qr-code-for-marketing-campaigns',
'/qr-code-for',
'/qr-code-print-size-guide',
'/use-cases/flyer-qr-codes',
'/use-cases/packaging-qr-codes',
'/use-cases/real-estate-sign-qr-codes',
'/use-cases/feedback-qr-codes',
'/use-cases/payment-qr-codes',
'/use-cases/coupon-qr-codes',
'/alternatives',
'/vs',
];
// Check if path is public
const isPublicPath = publicPaths.some(p => path === p || path.startsWith(p + '/'));
// Allow API routes
if (path.startsWith('/api/')) {
return attachAttributionCookie(req, NextResponse.next());
}
// Allow redirect routes (QR code redirects)
// Allow redirect routes (QR code redirects)
if (path.startsWith('/r/')) {
return attachAttributionCookie(req, NextResponse.next());
}
// Allow static files
// Allow static files
if (path.includes('.') || path.startsWith('/_next')) {
return attachAttributionCookie(req, NextResponse.next());
}
// Allow public paths
if (isPublicPath) {
return attachAttributionCookie(req, NextResponse.next());
@@ -158,7 +159,7 @@ export function middleware(req: NextRequest) {
// For protected routes, check for userId cookie
const userId = req.cookies.get('userId')?.value;
if (!userId) {
// Not authenticated - redirect to signup
const signupUrl = new URL('/signup', req.url);
@@ -170,16 +171,16 @@ export function middleware(req: NextRequest) {
// Authenticated - allow access
return attachAttributionCookie(req, NextResponse.next());
}
export const config = {
matcher: [
/*
* Match all request paths except for the ones starting with:
* - _next/static (static files)
* - _next/image (image optimization files)
* - favicon.ico (favicon file)
* - public folder
*/
'/((?!_next/static|_next/image|favicon.ico|logo.svg|og-image.png).*)',
],
};
export const config = {
matcher: [
/*
* Match all request paths except for the ones starting with:
* - _next/static (static files)
* - _next/image (image optimization files)
* - favicon.ico (favicon file)
* - public folder
*/
'/((?!_next/static|_next/image|favicon.ico|logo.svg|og-image.png).*)',
],
};