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

访问/info时出现ERR_TOO_MANY_REDIRECTS循环重定向问题求助

解决Express在cPanel部署时/info与/info/循环重定向问题

问题分析

在cPanel部署的Express应用中,访问/info触发ERR_TOO_MANY_REDIRECTS,核心原因是Apache(cPanel默认Web服务器)的自动尾斜杠重定向规则与Express路由匹配逻辑冲突,导致请求在带/不带尾斜杠的路径间来回跳转。


解决方案

1. 统一Express的尾斜杠处理逻辑

通过中间件强制统一路径格式,避免双向跳转:

// 在Express初始化后、路由注册前添加
app.use((req, res, next) => {
  // 移除非根路径末尾的斜杠
  if (req.path.endsWith('/') && req.path.length > 1) {
    const cleanPath = req.path.slice(0, -1) + req.url.slice(req.path.length);
    return res.redirect(301, cleanPath);
  }
  next();
});

// 保持原路由不变,现在会匹配带/不带尾斜杠的请求
app.get('/info', (req, res) => {
  res.render('info', {
    layout: 'layouts/layout',
    title: 'Info',
    user: req.session.user,
  });
});

2. 调整cPanel的.htaccess配置

cPanel自动生成的反向代理规则可能触发尾斜杠循环,修改.htaccess文件,添加尾斜杠统一规则:

RewriteEngine On

# 先移除所有非根路径的尾斜杠
RewriteCond %{REQUEST_URI} ^(.+)/+$
RewriteRule ^(.+)/+$ $1 [R=301,L]

# 保留原有反向代理规则(替换3000为你的Node应用监听端口)
RewriteRule ^$ http://127.0.0.1:3000/ [P,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ http://127.0.0.1:3000/$1 [P,L]

3. 临时兼容方案:注册双路由

如果以上方法无法立即生效,可直接注册两个路由覆盖两种路径:

// 匹配不带尾斜杠的请求
app.get('/info', renderInfoPage);

// 匹配带尾斜杠的请求,重定向到不带斜杠的版本
app.get('/info/', (req, res) => {
  res.redirect(301, '/info');
});

// 提取渲染逻辑复用
function renderInfoPage(req, res) {
  res.render('info', {
    layout: 'layouts/layout',
    title: 'Info',
    user: req.session.user,
  });
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 19:45:15