我有一个使用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('/')运行时,这将破坏路径。

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

最佳答案

为了同时使用两种方法,您需要为每个请求计算代理路径或本地路径。

我正在使用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");

关于node.js - Node Express:使用代理时res.redirect损坏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21856426/

10-16 20:52