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

DigitalOcean App Platform中NextResponse.redirect()失效,返回200而非3xx

解决Next.js中间件在DigitalOcean App Platform的重定向失效问题

可能的原因分析

  • DigitalOcean App Platform对Next.js中间件的执行环境存在特殊处理,比如请求头传递、cookie解析逻辑与Vercel/本地环境有差异
  • 中间件中NextResponse.redirect()的调用方式在DO部署环境未被正确处理,或DO反向代理拦截了重定向响应头
  • Docker镜像构建配置缺失,导致Next.js中间件未被正确打包激活

具体解决方案

1. 规范中间件文件路径与命名

确保中间件文件命名为middleware.ts(或.js),且放置在项目根目录(而非pages/app子目录)——Next.js 13+的App Router要求全局中间件必须在根目录才能生效。

2. 调整重定向逻辑写法

显式指定重定向状态码,并使用完整URL而非相对路径调用NextResponse.redirect:

import { NextResponse } from 'next/server'
import type { NextRequest } from 'next/server'

export function middleware(request: NextRequest) {
  const jwtCookie = request.cookies.get('jwt')
  const isAuthRoute = request.nextUrl.pathname.startsWith('/dashboard')

  if (isAuthRoute && !jwtCookie) {
    // 使用请求的基础URL拼接目标路径,显式设置302状态码
    return NextResponse.redirect(new URL('/', request.url), { status: 302 })
  }

  return NextResponse.next()
}

// 明确指定中间件匹配的路由范围
export const config = {
  matcher: ['/', '/dashboard/:path*'],
}

3. 检查DigitalOcean部署配置

  • 确认应用的Build Command为npm run build(或对应yarn/pnpm命令),不要自定义跳过Next.js的构建流程
  • 确保Run Command使用官方启动命令npm start,避免用自定义node命令跳过Next.js的请求处理逻辑
  • 暂时关闭DO后台的"Force HTTPS"配置测试,排查是否是反向代理修改了响应头

4. 修正Dockerfile配置(镜像部署场景)

确保Dockerfile正确复制构建产物、暴露默认端口,且不使用静态导出(静态站点不支持中间件):

FROM node:18-alpine

WORKDIR /app

COPY package*.json ./
RUN npm ci

COPY . .
RUN npm run build

EXPOSE 3000

CMD ["npm", "start"]

5. 验证请求与cookie传递

在中间件中添加日志,部署后查看DO应用日志确认cookie是否被正确接收:

export function middleware(request: NextRequest) {
  console.log('请求路径:', request.nextUrl.pathname)
  console.log('JWT Cookie:', request.cookies.get('jwt'))
  // 原有逻辑...
}

如果日志中未获取到jwt cookie,需检查DO平台的cookie传递限制(比如SameSite属性配置)


内容的提问来源于stack exchange,提问作者Bartek Pacia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 19:52:20