【问题标题】:Node Express: res.redirect broken when using proxyNode Express:使用代理时 res.redirect 中断
【发布时间】:2014-03-18 08:43:00
【问题描述】:

我有一个 node express 应用程序在代理后面运行,使用 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 在下面的 cmets 中所建议的那样,我可以硬编码我的所有路径以适应新环境,但是当在我的本地计算机上以根 ('/') 运行时,这会破坏路径。

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

【问题讨论】:

  • 您似乎没有重定向到正确的页面。您的新应用植根于/nodeapp,但您正尝试重定向到/login。在 Passport 中,您可以提供 successRedirectfailureRedirect 路径...您需要以 /nodeapp 开头的路径。
  • 感谢 Ethan,在远程服务器上使用我的应用程序时,您的解决方案对我有用。但是,当在我的本地机器上运行应用程序时,当然路径现在不正确。我正在寻找可以适应不同运行时环境的更集中的解决方案?

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


【解决方案1】:

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

我正在使用 Nginx 代理,它注入“x-forwarded-for”和“x-forwarded-proto”(原始请求的协议)。转储“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");

【讨论】:

    猜你喜欢
    • 2014-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多