Node Express:使用代理时res.redirect断开

时间:2014-02-18 14:15:15

标签: node.js express apache2 reverse-proxy passport.js

我使用Apache ProxyPass(在httpd.conf中配置)在代理后面运行节点快速应用程序:

ProxyPass /nodeapp http://localhost:9009

我的应用程序使用Passport对用户进行身份验证,因此当我访问基本路径时,我应该重定向到登录页面:

- 旧重定向:http://example.com:9009 - > http://example.com:9009/login

- 新重定向:http://example.com/nodeapp - > http://example.com/nodeapp/login

不幸的是,重定向无效:

- 损坏的重定向:http://example.com/nodeapp - > http://example.com/login

我尝试在express中启用代理配置,但这没有区别:

 app.enable('trust proxy');

**编辑:** 正如Ethan在下面的评论中所建议的那样,我可以硬编码所有路径以适应新环境,但是这会在我的本地机器上以root('/')运行时打破路径。

我正在寻找一种更加集中的解决方案,如果可能的话,它可以适应不同的运行时环境吗?

1 个答案:

答案 0 :(得分:1)

为了双向工作,您需要为每个请求计算代理路径或本地路径。

我正在使用Nginx代理,它注入“x-forwarded-for”和“x-forwarded-proto”(oringinal request协议)。转储“req.headers”以查看代理可以传递的标头。

在路线前的Express配置中创建:

app.use(function(req, res, next) {

  if (req.headers.hasOwnProperty('x-forwarded-for')) {
     // proxy in effect
     req.redirUrl = req.headers['x-forwarded-proto']
        + "://"
        + req.headers.host    // proxy
        // plus any proxy subdirs if needed 
        + "/"
        + proxy_subdir
     ;

  } else {
     // direct requeset
     req.redirUrl = req.protocol
        + "://"
        + req.headers.host
     ;
  }

  next();
});

您现在有一个req.redirUrl,您可以在任何重定向的开头使用,它将在代理或直接访问下工作:

res.redirect(req.redirUrl + "/redir_path");