import { NextResponse } from 'next/server' import type { NextRequest } from 'next/server' import { isIpAllowed, getClientIp } from '@/lib/ip-utils' export function middleware(request: NextRequest) { // 檢查是否啟用IP白名單 const enableIpWhitelist = process.env.ENABLE_IP_WHITELIST === 'true' if (!enableIpWhitelist) { return NextResponse.next() } // 獲取客戶端IP const clientIp = getClientIp(request) // 獲取允許的IP列表 const allowedIps = process.env.ALLOWED_IPS || '' // 檢查IP是否被允許 if (!isIpAllowed(clientIp, allowedIps)) { // 記錄被拒絕的訪問 console.warn(`Access denied for IP: ${clientIp} - Path: ${request.nextUrl.pathname}`) // 返回403禁止訪問頁面 return new NextResponse( ` 訪問被拒絕

🚫 訪問被拒絕

很抱歉,您的IP地址不在允許的訪問列表中。

您的IP地址:
${clientIp}

如果您認為這是一個錯誤,請聯繫系統管理員。

錯誤代碼:403 Forbidden
時間:${new Date().toLocaleString('zh-TW')}
`, { status: 403, headers: { 'Content-Type': 'text/html; charset=utf-8', }, } ) } // IP檢查通過,繼續處理請求 return NextResponse.next() } // 配置中間件適用的路徑 export const config = { matcher: [ /* * 匹配所有路徑,除了: * - api (API routes) * - _next/static (static files) * - _next/image (image optimization files) * - favicon.ico (favicon file) * - icon.png (icon file) */ '/((?!api|_next/static|_next/image|favicon.ico|icon.png).*)', ], }