AWS EC2服务器上NextJs路由重定向失败问题求助
问题排查与修复方案
核心错误原因
你的自定义服务器只注册了/industry-reports的路由规则,而请求的/industry-reports/(带尾部斜杠)没有对应的路由处理逻辑,导致Express直接返回Cannot GET /industry-reports/的404错误——你写的判断尾部斜杠的代码根本没机会执行,因为请求连这个路由处理函数都进不来。
另外,你代码里的重定向目标写的是外部网站(Google/Facebook),这和你要实现的“重定向到不带尾部斜杠的同路径”需求不符,属于测试代码遗漏修正。
修复代码方案
推荐两种方式,优先选全局处理(无需逐个路由配置):
方式1:全局统一处理所有带尾部斜杠的请求
在所有具体路由之前添加全局拦截逻辑,自动重定向到不带斜杠的路径:
const express = require('express'); const next = require('next'); const dev = process.env.NODE_ENV !== 'production'; const app = next({ dev }); const handle = app.getRequestHandler(); const server = express(); // 全局拦截所有带尾部斜杠的请求(根路径"/"除外) server.get('*', (req, res, next) => { if (req.url.length > 1 && req.url.endsWith('/')) { // 去掉尾部斜杠,生成新路径 const targetUrl = req.url.slice(0, -1); // 301永久重定向 return res.redirect(301, targetUrl); } // 非带斜杠请求,继续走后续路由逻辑 next(); }); // 处理你的具体页面路由 server.get('/industry-reports', async (req, res) => { const actualPage = '/industry-reports'; app.render(req, res, actualPage); }); // 其他默认路由处理 server.all('*', (req, res) => { return handle(req, res); }); app.prepare().then(() => { server.listen(3000, (err) => { if (err) throw err; console.log('> Ready on http://localhost:3000'); }); });
方式2:单独处理单个带斜杠的路由
如果只需要针对某几个路由处理,可以单独注册带斜杠的路由规则:
// 先处理带尾部斜杠的路由,重定向到不带斜杠的版本 server.get('/industry-reports/', async (req, res) => { return res.redirect(301, '/industry-reports'); }); // 再处理不带斜杠的路由,渲染页面 server.get('/industry-reports', async (req, res) => { const actualPage = '/industry-reports'; app.render(req, res, actualPage); });
验证注意事项
- 部署到EC2后,确保重启Next.js服务,让新的server.js生效
- 清除浏览器缓存(因为301重定向会被浏览器缓存),再测试带斜杠的请求
内容的提问来源于stack exchange,提问作者Digvijay Singh Thakur
相关产品推荐
相关产品推荐

