fix: /en/* 显式规范化重定向进 proxy(底座契约,不依赖 next-intl 内部行为)
- proxy 显式拦截 /en 与 /en/* → 307 到去前缀形式(带 query 保留), 历史或外部 /en/* 链接永远落到规范 URL - 实测:用户报告的 /en/login 404 在当前部署无法复现(五站均 307→200), 推断为早前构建残缺窗口期的缓存;显式规则使该行为永固可测
This commit is contained in:
@@ -1,11 +1,27 @@
|
||||
import createIntlMiddleware from 'next-intl/middleware';
|
||||
import { routing } from './i18n/routing';
|
||||
import type { NextRequest } from 'next/server';
|
||||
import { NextResponse } from 'next/server';
|
||||
import { NextRequest, NextResponse } from 'next/server';
|
||||
|
||||
const intlMiddleware = createIntlMiddleware(routing);
|
||||
|
||||
/**
|
||||
* # proxy
|
||||
* 说明:站点入口中间件。
|
||||
* - 显式规范化:/en 与 /en/* 307 → 去前缀形式(/ 与 /*)。
|
||||
* 底座契约:默认语言 URL 不带前缀;历史/外部 /en/* 链接永远落到规范 URL,
|
||||
* 行为不依赖 next-intl 内部实现。中文 /zh/* 由 intlMiddleware 正常处理。
|
||||
*/
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user