next-intl中间件接收请求后如何重写请求?
解决next-intl中间件中实现OneLink深度链接URL重写的问题
先修正你代码里的核心问题:
- 未导入
NextResponse,无法使用URL重写API - 直接返回
NextResponse会覆盖next-intl的国际化路由处理逻辑 - 缺少从查询参数提取OneLink跳转信息的逻辑
以下是修改后的完整可运行代码:
import createIntlMiddleware from 'next-intl/middleware'; import { NextRequest, NextResponse } from 'next/server'; // 补充导入NextResponse export default async function middleware(request: NextRequest) { // Step 1: 获取默认语言 const defaultLocale = request.headers.get('x-default-locale') || 'en'; // Step 2: 初始化并执行国际化路由中间件 const handleI18nRouting = createIntlMiddleware({ locales: ['en', 'de'], defaultLocale }); let response = handleI18nRouting(request); // Step 3: 保留自定义响应头 response.headers.set('x-default-locale', defaultLocale); // Step 4: 处理OneLink深度链接重写 // 假设你的OneLink用`deep_link`参数传递目标路径,可根据实际参数名调整 const deepLinkPath = request.nextUrl.searchParams.get('deep_link'); if (deepLinkPath) { // 构建带语言前缀的目标URL,适配next-intl路由规则 const targetUrl = new URL(`/${request.nextUrl.locale}${deepLinkPath}`, request.url); // 创建重写响应并保留原有头部 response = NextResponse.rewrite(targetUrl); response.headers.set('x-default-locale', defaultLocale); } return response; } export const config = { matcher: ['/((?!_next|.*\\..*).*)'] };
关键细节说明:
- 参数适配:如果你的OneLink用其他参数名(比如
link、target)传递跳转路径,直接替换deep_link即可 - 复杂参数解析:若OneLink通过多个参数拼接路径(如
page=product&id=123),可扩展逻辑:const page = request.nextUrl.searchParams.get('page'); const id = request.nextUrl.searchParams.get('id'); if (page && id) { const deepLinkPath = `/${page}/${id}`; // 执行重写逻辑 } - 语言前缀:重写URL必须带上当前语言前缀(如
/en、/de),确保符合next-intl的国际化路由规则
内容的提问来源于stack exchange,提问作者Furquan
相关产品推荐
相关产品推荐

