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

为何Next.js自定义服务器适配pages/目录却不适配app/目录?

问题:Next.js App Router应用使用自定义JS Server返回空白页面

我有两个Next.js应用,一个基于pages/目录,另一个基于app/目录。使用官方文档所述的自定义JS Server部署时,仅Pages Router的应用能正常运行,App Router的应用返回空白页面,仅输出以下内容:

<html>
    <head></head>
    <body></body>
</html>

当前使用的.htaccess配置如下:

PassengerAppRoot "/home/user/frontend"
PassengerBaseURI "/"
PassengerNodejs "/home/user/nodevenv/frontend/16/bin/node"
PassengerAppType node
PassengerStartupFile server.js

解决方案

1. 升级Node.js版本

App Router要求Node.js版本≥18.17.0,你的配置中使用的是Node.js 16,存在兼容性问题。升级到18.x或20.x版本后,更新.htaccess中的Node路径:

PassengerNodejs "/home/user/nodevenv/frontend/18/bin/node"

2. 修正自定义Server代码适配App Router

App Router对自定义Server的API有要求,确保使用正确的初始化和请求处理逻辑,示例代码如下:

const { createServer } = require('http')
const { parse } = require('url')
const next = require('next')

const dev = process.env.NODE_ENV !== 'production'
const hostname = 'localhost'
const port = process.env.PORT || 3000

const app = next({ dev, hostname, port })
const handle = app.getRequestHandler()

app.prepare().then(() => {
  createServer(async (req, res) => {
    try {
      const parsedUrl = parse(req.url, true)
      await handle(req, res, parsedUrl)
    } catch (err) {
      console.error('处理请求出错:', req.url, err)
      res.statusCode = 500
      res.end('内部服务器错误')
    }
  }).listen(port, (err) => {
    if (err) throw err
    console.log(`> 服务已启动:http://${hostname}:${port}`)
  })
})

3. 检查Passenger与构建配置

  • 确保App Router应用已执行next build生成.next目录,且该目录与server.js同属PassengerAppRoot指定的路径
  • 在.htaccess中添加环境变量声明,明确生产环境:
PassengerEnvVar NODE_ENV production

4. 排查自定义路由干扰

如果自定义Server中存在自定义路由规则,确保未匹配的请求全部交给Next.js的请求处理器处理,避免提前返回空白响应。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 16:19:59