我有一个使用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/