Middleware — proxy.ts
O middleware vive em apps/web/proxy.ts e intercepta todas as requisições antes de chegarem às rotas. Ele encadeia i18n, headers seguros, autenticação e roteamento de padrões de URL.
Fluxo de execução
Request
│
▼ 1. next-intl middleware (i18n routing)
▼ 2. createResponseWithSecureHeaders (CSP headers, se ENABLE_STRICT_CSP=true)
▼ 3. setRequestId (x-correlation-id header)
▼ 4. matchUrlPattern → handler específico por rota
▼ 5. isServerAction → adiciona x-action-path nos server actions
│
▼ Response
Matcher — paths excluídos
O middleware não roda nos seguintes paths (configurado em config.matcher):
'/((?!_next/static|_next/image|images|Video|locales|assets|sitemap.xml|robots.txt|api/*).*)'
| Exclusão | Motivo |
|---|---|
_next/static | Arquivos estáticos do Next.js |
_next/image | Otimização de imagens do Next.js |
images | Assets públicos de imagem |
Video | Arquivos de vídeo públicos (adicionado no TEC-17 para /Video/abracaf/) |
locales | Arquivos de tradução i18n |
assets | Assets genéricos |
sitemap.xml / robots.txt | SEO |
api/* | Route Handlers — têm sua própria autenticação |
Adicionar uma nova exclusão de path
Para servir novos diretórios de assets sem passar pelo middleware, adicione o nome ao padrão no início da expressão negativa:
// de:
'/((?!_next/static|_next/image|images|Video|locales|...).*)'
// para:
'/((?!_next/static|_next/image|images|Video|NovaPasta|locales|...).*)'
Handlers por padrão de URL
| Padrão | Handler | O que faz |
|---|---|---|
/admin/* | adminMiddleware | Verifica se o usuário é super admin; redireciona para /404 se não for |
/auth/* | handler inline | Se usuário já autenticado, redireciona para /home (exceto /auth/verify-mfa) |
/home/* | handler inline | Se usuário não autenticado, redireciona para /auth/sign-in?next=<path>; verifica MFA |
Adicionar um novo handler
Em getPatterns(), adicionar uma entrada ao array:
{
pattern: new URLPattern({ pathname: '/minha-rota/*?' }),
handler: async (req: NextRequest, res: NextResponse) => {
// lógica de guarda
// retornar undefined para continuar o fluxo normal
// retornar NextResponse para interromper e responder
},
},
Headers adicionados em toda requisição
| Header | Valor | Quando |
|---|---|---|
x-correlation-id | UUID aleatório | Sempre |
x-action-path | request.nextUrl.pathname | Somente em Server Actions |
CSP (Content Security Policy)
Desativado por padrão. Para ativar:
ENABLE_STRICT_CSP=true
Quando ativo, importa ./lib/create-csp-response e aplica os headers CSP sobre a resposta do i18n middleware.