Next.js 13(App Router)部署IIS后API路由失效及0B问题求助
Next.js 13 App Router API路由部署到IIS失效问题排查与解决
问题原因解析
1. 构建日志中/api/hello显示0B且标记为○(Static)的原因
Next.js 13 App Router的API路由机制和Next.js 12使用的Pages Router完全不同:
- Pages Router的
/api/hello属于服务器端路由(标记为λ),构建时会保留服务器端执行逻辑,依赖Node.js运行时处理请求。 - 你日志中App Router下的
/api/hello被标记为○(Static),说明Next.js将其识别为静态资源而非服务器端API,通常是因为:- API路由文件不符合App Router规范(比如文件名不是
route.ts/js,或未导出HTTP方法); - 配置了
output: 'export'强制静态导出,导致服务器端API逻辑被丢弃,最终输出空的静态资源(0B)。
- API路由文件不符合App Router规范(比如文件名不是
2. IIS部署的核心差异
Next.js 12 Pages Router的API可以通过iisnode等模块直接在IIS中运行Node.js代码,但App Router的服务器端路由/API必须依赖Next.js官方的生产服务器运行,无法直接以静态文件形式部署到IIS。
解决步骤
1. 修正App Router API路由规范
确保你的API路由完全符合App Router要求:
- 目录结构必须为:
app/api/hello/route.ts(或.js) - 文件中必须导出对应HTTP方法,示例代码:
重新执行// app/api/hello/route.ts export async function GET(request: Request) { return new Response('Hello from Next.js 13 API!', { status: 200, headers: { 'Content-Type': 'text/plain' } }) }npm run build,此时/api/hello应该会被识别为服务器端路由(若使用output: 'standalone'会显示对应的服务器chunk)。
2. 调整IIS部署方式
App Router应用不能直接作为静态站点部署,需要通过反向代理将IIS请求转发到Next.js生产服务器:
- 安装依赖模块:在IIS中安装
Application Request Routing (ARR)和URL Rewrite模块。 - 启动Next.js生产服务器:
- 构建应用:
npm run build - 启动服务器:
npm start(默认监听3000端口,可通过PORT环境变量修改)
- 构建应用:
- 配置IIS反向代理:
- 在IIS中创建新网站,物理路径可设为任意目录(无需指向build文件夹);
- 添加URL重写规则,将所有请求转发到
http://localhost:3000,示例web.config:<configuration> <system.webServer> <rewrite> <rules> <rule name="ReverseProxyInboundRule1" stopProcessing="true"> <match url="(.*)" /> <action type="Rewrite" url="http://localhost:3000/{R:1}" /> </rule> </rules> </rewrite> </system.webServer> </configuration>
- 测试API路由:访问
http://你的IIS域名/api/hello,应该能正常返回响应。
3. 检查Next.js配置
打开next.config.js,确保没有以下配置:
module.exports = { output: 'export' // 该配置会强制静态导出,不支持服务器端API }
若需要精简服务器部署包,可使用output: 'standalone',它会生成包含所有依赖的独立服务器包,方便部署。
内容的提问来源于stack exchange,提问作者karthi
相关产品推荐
相关产品推荐

