fix: /en/* 显式规范化重定向进 proxy(底座契约,不依赖 next-intl 内部行为)

- proxy 显式拦截 /en 与 /en/* → 307 到去前缀形式(带 query 保留),
  历史或外部 /en/* 链接永远落到规范 URL
- 实测:用户报告的 /en/login 404 在当前部署无法复现(五站均 307→200),
  推断为早前构建残缺窗口期的缓存;显式规则使该行为永固可测
This commit is contained in:
AI Directory Platform
2026-09-10 06:34:59 +00:00
parent c00600b9a7
commit 86d0d9c7ed
+18 -2
View File
@@ -1,11 +1,27 @@
import createIntlMiddleware from 'next-intl/middleware'; import createIntlMiddleware from 'next-intl/middleware';
import { routing } from './i18n/routing'; import { routing } from './i18n/routing';
import type { NextRequest } from 'next/server'; import { NextRequest, NextResponse } from 'next/server';
import { NextResponse } from 'next/server';
const intlMiddleware = createIntlMiddleware(routing); const intlMiddleware = createIntlMiddleware(routing);
/**
* # proxy
* 说明:站点入口中间件。
* - 显式规范化:/en 与 /en/* 307 → 去前缀形式(/ 与 /*)。
* 底座契约:默认语言 URL 不带前缀;历史/外部 /en/* 链接永远落到规范 URL,
* 行为不依赖 next-intl 内部实现。中文 /zh/* 由 intlMiddleware 正常处理。
*/
export function proxy(request: NextRequest) { export function proxy(request: NextRequest) {
const { pathname, search } = request.nextUrl;
if (pathname === '/en' || pathname.startsWith('/en/')) {
const target = pathname === '/en' ? '/' : pathname.slice(3);
return NextResponse.redirect(
new URL(`${target}${search}`, request.url),
307
);
}
return intlMiddleware(request); return intlMiddleware(request);
} }