@@ -147,19 +147,23 @@ const SECURITY_HEADERS = {
147147/**
148148 * Apply security protections to the request
149149 *
150- * Handles multi-tenant context, rate limiting, CSRF protection, and security headers.
150+ * Handles multi-tenant context preparation , rate limiting, CSRF protection, and security headers.
151151 * Exported for testing purposes.
152152 *
153+ * Note: Proxy runs in Edge runtime - cannot use Prisma or AsyncLocalStorage.
154+ * Store resolution must happen in API routes/Server Components using resolveStore().
155+ *
153156 * @param request - NextRequest to protect
154157 * @returns NextResponse with security headers applied
155158 */
156159export async function applySecurityProtections ( request : NextRequest ) : Promise < NextResponse > {
157160 const { method, url } = request ;
158161 const { pathname } = new URL ( url ) ;
159162
160- // 0. Multi-tenant Context (removed in proxy):
161- // Do not attempt to access getServerSession or Prisma in proxy (Edge runtime).
162- // Tenant context is enforced within server routes and Prisma middleware.
163+ // 0. Multi-tenant Context Preparation:
164+ // Proxy sets X-Forwarded-Host header for API routes/Server Components to resolve storeId.
165+ // Actual resolution happens in server context using resolveStore() from @/lib/store/resolve-store
166+ // due to Edge runtime limitations (no Prisma, no AsyncLocalStorage).
163167
164168 // 1. Rate Limiting: Check request limits
165169 const rateLimitResult = checkSimpleRateLimit ( request ) ;
@@ -191,6 +195,10 @@ export async function applySecurityProtections(request: NextRequest): Promise<Ne
191195 // 3. Security Headers: Apply to all responses
192196 const response = NextResponse . next ( ) ;
193197
198+ // Set X-Forwarded-Host for store resolution in API routes
199+ const host = request . headers . get ( 'host' ) || '' ;
200+ response . headers . set ( 'x-forwarded-host' , host ) ;
201+
194202 // Apply all security headers
195203 Object . entries ( SECURITY_HEADERS ) . forEach ( ( [ key , value ] ) => {
196204 response . headers . set ( key , value ) ;
@@ -215,6 +223,12 @@ console.log('[PROXY] Module loaded');
215223export default async function proxy ( req : NextRequest ) {
216224 const { pathname } = req . nextUrl ;
217225
226+ // 0. Canonical Domain Redirect
227+ // Note: Actual canonical redirect happens in storefront Server Components via
228+ // checkCanonicalRedirect() from @/lib/store/canonical-redirect
229+ // Proxy only sets x-forwarded-host header for server-side resolution
230+ // (Edge runtime cannot access Prisma for StoreDomain lookup)
231+
218232 // Import RBAC helpers lazily to keep edge bundle small
219233 const { canAccess, isPublicRoute, getDefaultRedirect } = await import ( './src/lib/auth/permissions' ) ;
220234
0 commit comments