You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 09:12:09