访问/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
相关产品推荐
相关产品推荐

