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

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);
});

验证注意事项

  1. 部署到EC2后,确保重启Next.js服务,让新的server.js生效
  2. 清除浏览器缓存(因为301重定向会被浏览器缓存),再测试带斜杠的请求

内容的提问来源于stack exchange,提问作者Digvijay Singh Thakur

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 05:55:16