这看起来像 Node 端的重定向循环。
您提到服务器 B 是节点服务器,如果您不正确地设置路由,您可能会意外创建重定向循环。例如,如果您在服务器 B(节点服务器)上使用 express,您可能有两个路由,并假设您将路由逻辑保存在单独的模块中:
var routes = require(__dirname + '/routes/router')(app);
//... express setup stuff like app.use & app.configure
app.post('/apicall1', routes.apicall1);
app.post('/apicall2', routes.apicall2);
然后你的 routes/router.js 可能看起来像:
module.exports = Routes;
function Routes(app){
var self = this;
if (!(self instanceof Routes)) return new Routes(app);
//... do stuff with app if you like
}
Routes.prototype.apicall1 = function(req, res){
res.redirect('/apicall2');
}
Routes.prototype.apicall2 = function(req, res){
res.redirect('/apicall1');
}
这个例子很明显,但是您可能在其中一些路由的一堆条件中隐藏了一个重定向循环。我将从边缘情况开始,例如在相关路由中的条件结束时会发生什么,如果调用没有正确的参数,默认行为是什么,异常行为是什么?
顺便说一句,您可以使用 node-validator ( https://github.com/chriso/node-validator ) 之类的东西来帮助确定和处理不正确的请求或发布参数
// Inside router/routes.js:
var check = require('validator').check;
function Routes(app){ /* setup stuff */ }
Routes.prototype.apicall1 = function(req, res){
try{
check(req.params.csrftoken, 'Invalid CSRF').len(6,255);
// Handle it here, invoke appropriate business logic or model,
// or redirect, but be careful! res.redirect('/secure/apicall2');
}catch(e){
//Here you could Log the error, but don't accidentally create a redirect loop
// send appropriate response instead
res.send(401);
}
}
为了帮助确定它是否是一个重定向循环,你可以做几件事之一,你可以使用 curl 以相同的帖子参数点击 url(假设它是一个帖子,否则你可以只使用 chrome,它会出错如果控制台注意到重定向循环),或者您可以写入节点服务器上的标准输出或在有问题的路由内写入系统日志。
希望对您有所帮助,您提到了“由重定向引起”部分,这就是我认为的问题。
上面的示例情况使用 express 来描述情况,但当然,如果您根本不使用任何框架或库,则仅使用 connect、其他框架甚至您自己的处理程序代码也可能存在问题。无论哪种方式,我都会养成进行良好参数检查并始终测试您的边缘情况的习惯,当我过去很匆忙时,我就遇到了这个问题。