一文搞懂Next.js中Proxy的使用

 更新时间:2026年03月05日 09:01:20   作者:helloweilei  
在Next.js中,Proxy这个概念实际上指向两个不同层面但同样重要的功能,下面就来详细的介绍一下Next.js中的Proxy的使用,感兴趣的可以了解一下

在 Next.js 中,“Proxy” 这个概念实际上指向两个不同层面但同样重要的功能:一个是 Next.js 15 之后内置的、运行在边缘网络上的请求拦截器(原 Middleware),另一个则是通过配置文件实现的、用于转发 API 请求的 Rewrites 代理

简单来说,前者像是应用的门卫,后者则像是应用的传话员

为了帮你更清晰地理解,我把它们的核心区别整理成了一个表格:

特性内置 proxy (原 Middleware)配置 rewrites (反向代理)
核心定位在请求到达页面之前,运行自定义代码进行拦截和处理。将请求从一个路径“映射”到另一个路径(可以是内部或外部URL),对客户端透明。
主要用途鉴权、A/B测试、国际化、日志记录、修改请求/响应头。解决跨域问题、隐藏真实API地址、将旧站点路由平滑过渡到新应用、集成第三方服务。
运行时机在 redirects 之后,beforeFiles rewrites 之前。有三种时机:beforeFiles, afterFiles, fallback,可以在文件系统(页面/静态文件)检查前后执行。
代码位置项目根目录下的 proxy.ts 或 proxy.js 文件。next.config.js 文件中的 async rewrites() 函数。
能力范围可以编程式地返回 NextResponse,实现 redirect, rewrite, 或直接响应。声明式地配置 source 和 destination 映射关系,支持复杂的路径匹配规则。

深入理解:内置proxy(原 Middleware)

从 Next.js 15 开始,原来的 middleware 文件被重命名为 proxy,其功能保持不变。你可以把它想象成一个在服务器上运行、在用户请求到达页面之前的“检查站”。

  • 关键特性与能力 在 proxy 函数中,你可以访问 NextRequest 对象,并通过返回 NextResponse 来实现多种操作:

    1. 重写(Rewrite):在服务端将请求映射到另一个 URL,但客户端浏览器地址栏的 URL 不会改变。这非常适合做 A/B 测试或在同一个域名下托管不同版本的应用。
      // proxy.ts
      import { NextResponse } from 'next/server'
      import type { NextRequest } from 'next/server'
      
      export function proxy(request: NextRequest) {
        if (request.nextUrl.pathname.startsWith('/about')) {
          // 访问 /about 的用户,实际看到的是 /about-2 页面的内容
          return NextResponse.rewrite(new URL('/about-2', request.url))
        }
      }
      
    2. 重定向(Redirect):将请求引导至另一个 URL,浏览器地址栏会更新。适用于用户登录校验或永久移动的页面。
      // proxy.ts
      import { NextResponse } from 'next/server'
      import type { NextRequest } from 'next/server'
      
      export function proxy(request: NextRequest) {
        if (!isLoggedIn(request)) {
          // 未登录用户访问 dashboard 时,跳转到登录页
          return NextResponse.redirect(new URL('/login', request.url))
        }
      }
      
    3. 操作头信息与 Cookie:可以读取、设置或删除请求头和响应头,以及 Cookie,用于实现功能开关、用户追踪等。
    4. 直接响应:甚至可以直接在 proxy 层返回一个响应体,而不需要经过页面渲染,比如返回一个简单的 robots.txt 或维护页面。
  • 配置与执行 proxy 默认会作用于所有路由,因此强烈建议通过导出的 config 对象中的 matcher 选项来精确控制其生效路径,以优化性能。

    // proxy.ts
    export const config = {
      matcher: [
        /*
         * 匹配所有除了以这些开头的路径:
         * - api (API routes)
         * - _next/static (静态文件)
         * - _next/image (图片优化文件)
         * - favicon.ico, sitemap.xml (静态资源文件)
         */
        '/((?!api|_next/static|_next/image|favicon.ico|sitemap.xml).*)',
      ],
    }
    

深入理解:配置rewrites(反向代理)

rewrites 是定义在 next.config.js 中的一个异步函数,它更像是一种“声明式”的代理规则。它告诉 Next.js 服务器:“当用户请求路径 A 时,你悄悄地替我去路径 B 拿到内容,然后返回给用户。”

  • 核心价值与场景

    1. 解决跨域(CORS):这是开发中最常见的用途。通过将前端对 /api 的请求,在 Next.js 服务端转发到真实的后端 API 地址(如 https://api.example.com),从而绕过了浏览器的同源策略。
      // next.config.js
      module.exports = {
        async rewrites() {
          return [
            {
              source: '/api/:path*', // 前端请求的路径
              destination: 'https://api.example.com/:path*', // 实际转发的后端地址
            },
          ]
        },
      }
      
    2. 集成第三方服务:可以隐藏第三方服务的真实地址,将其“包装”成自己域名下的接口,避免被广告 屏 蔽器拦截,同时也更安全。
    3. 平滑迁移:当你将旧站点逐步迁移到 Next.js 时,可以用 fallback 类型的 rewrites,让所有不存在的页面都 fallback 到旧站点,实现渐进式重构。
  • 三种执行时机 rewrites 函数可以返回一个对象,包含三种数组,它们在不同的时机执行,提供了极大的灵活性:

    • beforeFiles:在检查 public 目录下的静态文件和页面路由之前执行。可以用来覆盖某些特定页面。
    • afterFiles:在检查完静态文件和页面路由之后,但在动态路由(如 pages/[slug].js)之前执行。
    • fallback:在所有路由(包括动态路由)都没有匹配到之后,返回 404 页面之前执行。非常适合作为“最后一道防线”代理到旧系统。
  • 高级匹配规则 rewritessource 路径支持参数化和正则表达式,并能根据 hasmissing 条件(如特定的 header、cookie 或 query 参数)来决定是否应用。

    // next.config.js
    module.exports = {
      async rewrites() {
        return [
          {
            source: '/blog/:slug',
            destination: '/news/:slug', // 将 /blog/hello 转发到 /news/hello
          },
          {
            source: '/old/:path*',
            destination: 'https://legacy-site.com/:path*', // 代理到外部 URL
          },
          {
            source: '/admin/:path*',
            has: [{ type: 'cookie', key: 'authorized', value: 'true' }],
            destination: '/dashboard/:path*', // 只有携带特定 cookie 时才转发
          },
        ]
      },
    }
    

总结与选择指南

简单来说,如何选择取决于你的业务逻辑:

  • 如果你的逻辑是编程式的、条件复杂的、需要读取或修改请求/响应头,例如“检查用户是否登录,未登录就跳转”,那么请使用 proxy
  • 如果你的逻辑是声明式的、纯粹的路径映射,例如“将所有 /api 请求转发到另一个服务器来解决跨域问题”,那么请使用 rewrites

在开发环境中,rewrites 通常是解决 API 跨域问题的最简单、最标准的方法。而在生产环境中,虽然 rewrites 也可以作为反向代理,但更常见的做法是在 Next.js 应用前面再加一层专业的反向代理服务器(如 Nginx),来处理负载均衡、SSL 终端和安全防护等更底层的网络问题。

到此这篇关于一文搞懂Next.js中Proxy的使用的文章就介绍到这了,更多相关Next.js Proxy内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 微信小程序返回到顶部功能的简单实现

    微信小程序返回到顶部功能的简单实现

    在做微信小程序开发时,遇到一个问题,要如何实现返回顶部的功能,下面这篇文章主要给大家介绍了微信小程序返回到顶部功能的简单实现,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-11-11
  • uniapp自定义页面跳转loading的实现代码

    uniapp自定义页面跳转loading的实现代码

    有些页面加载起来比较慢,为了加强用户体验效果,所以一般都会做一个页面加载等待的提示,页面加载完成后消失,下面这篇文章主要给大家介绍了关于uniapp自定义页面跳转loading的实现代码,需要的朋友可以参考下
    2023-06-06
  • JS实现1000以内被3或5整除的数字之和

    JS实现1000以内被3或5整除的数字之和

    今天在技术群里看到一道这样的提:求1000以内被3或5整除的数字之和。小编把我的解决办法分享到脚本之家平台,供大家参考
    2016-02-02
  • js 函数的副作用分析

    js 函数的副作用分析

    函数副作用 指当调用函数时,除了返回函数值之外,还对主调用函数产生附加的影响。例如修改全局变量(函数外的变量)或修改参数。
    2011-08-08
  • js获取iframe中的window对象的实现方法

    js获取iframe中的window对象的实现方法

    下面小编就为大家带来一篇JS获得iframe中的window对象的实现方法。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-05-05
  • JS 特殊运算符的使用

    JS 特殊运算符的使用

    JavaScript中包含了一系列不常见但功能强大的特殊运算符,如空值合并运算符(??)、可选链运算符(?.)等,这些运算符在特定场景下极大地简化了代码的复杂度,并提高了开发效率,通过深入了解这些特殊运算符,开发者可以更加高效地处理各种数据和逻辑
    2024-09-09
  • Javascript添加监听与删除监听用法详解

    Javascript添加监听与删除监听用法详解

    这篇文章主要介绍了Javascript添加监听与删除监听用法,较为详细的分析了javascript原理与用法,并补充说明了事件监听的兼容性问题,非常具有实用价值,需要的朋友可以参考下
    2014-12-12
  • 详解TypeScript中模块化开发指南

    详解TypeScript中模块化开发指南

    在编程中,模块是指将相关的代码封装在一起,形成一个独立的单元,在这篇文章中,我们将深入探讨在TypeScript中如何定义、导入和导出模块,感兴趣的可以了解一下
    2023-06-06
  • js选项卡的实现方法

    js选项卡的实现方法

    这篇文章主要介绍了js选项卡的实现方法,实例分析了js选项卡的实现思路及html+css布局与js功能技巧,非常具有实用价值,需要的朋友可以参考下
    2015-02-02
  • 如何基于小程序实现发送语音消息及转文字功能

    如何基于小程序实现发送语音消息及转文字功能

    最近为小程序增加语音识别转文字的功能,坑路不断,特此记录,下面这篇文章主要给大家介绍了关于如何基于小程序实现发送语音消息及转文字功能的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-11-11

最新评论