Node请求PHP接口触发Too Many Redirects问题排查求助
从你的描述和日志对比来看,核心问题很明确:Node应用发送的请求实际上并没有到达PHP的/notifica端点,而是被解析成了根路径/,这才触发了无限重定向循环。Postman和浏览器能正常工作,是因为它们的请求路径被Apache正确识别并路由到了目标控制器。
为什么会出现这种差异?
我梳理了几个最可能的原因:
Node代理/请求的路径配置错误
如果你用Node作为代理转发请求(比如用http-proxy-middleware这类库),很可能是pathRewrite配置把路径写错了。比如不小心把/notifica重写为/,导致PHP收到的是根路径请求:// 错误配置:把/notifica重写为/ app.use('/notifica', proxy({ target: 'http://your-php-app', pathRewrite: { '^/notifica': '/' } // 这会把请求路径改成/ }));这种情况下,PHP的index.php如果对根路径
/有重定向到/notifica的逻辑,就会形成/→/notifica→/→...的循环,最终触发Too Many Redirects错误。请求URL拼写错误
如果你直接用axios/fetch等库发送请求,可能是代码里的URL写错了——比如把http://your-php-app/notifica写成了http://your-php-app,导致每次请求都指向根路径。缺失关键请求头(比如Host)
Apache的虚拟主机配置通常依赖Host头来路由到正确的站点。如果Node发送请求时没有设置正确的Host头,Apache可能会把请求路由到默认站点,而默认站点的根路径处理逻辑会触发重定向。Postman和浏览器会自动带上当前域名的Host头,所以不会有这个问题。
怎么解决?
针对上面的原因,你可以按以下步骤排查:
检查代理/请求的路径配置
如果用代理库,确保pathRewrite没有错误修改路径。正确的配置应该保持原路径不变,或者按需映射:// 正确配置:保持/notifica路径不变 app.use('/notifica', proxy({ target: 'http://your-php-app', changeOrigin: true, // 自动设置目标服务器的Host头 }));如果用axios/fetch,直接打印请求的URL确认是否正确:
const url = 'http://your-php-app/notifica'; console.log('Sending request to:', url); // 确认路径是/notifica而不是/ axios.get(url);添加正确的Host请求头
手动指定Host头,确保Apache能正确路由到你的PHP站点:axios.get('http://your-php-app/notifica', { headers: { 'Host': 'your-php-app-domain.com' // 替换为PHP服务器的实际域名/Host } });验证PHP根路径的处理逻辑
检查index.php中是否有对/的重定向代码,比如:if ($_SERVER['REQUEST_URI'] === '/') { header('Location: /notifica'); exit; }如果有,确认Node请求的确实是
/notifica而不是/——毕竟如果请求的是根路径,这种逻辑必然会触发重定向循环。检查Apache虚拟主机配置
确保你的虚拟主机配置中,ServerName或ServerAlias与Node请求的Host头匹配,避免因路由到错误站点导致的路径解析问题。
内容的提问来源于stack exchange,提问作者Thiago Loddi

