我使用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('/')运行时打破路径。
我正在寻找一种更加集中的解决方案,如果可能的话,它可以适应不同的运行时环境吗?
答案 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");