Openshift 302 mangling

时间:2016-03-04 12:19:24

标签: openshift url-routing

我在http://rsdbtest-abex.rhcloud.com/ CNAME处有一个申请。它具有以下域的别名和匹配http://rsdb-test.tk/

http://www.rsdb-test.tk/http://sub.rsdb-test.tk/http://sub.sub.rsdb-test.tk//

服务器设置为响应Location express的请求对象。任何其他路径都会生成302,并将http://rsdb-test.tk/http://sub.rsdb-test.tk标头设置为路径,因此理论上,http://sub.rsdb-test.tk的请求会将您带到http://rsdb-test.tk。这在本地工作,但退出OpenShift路由器后的位置是Location。域名将替换为请求的域名。如果您在本地运行服务器或从齿轮内部卷曲,<meta>标题仍然正确,表明我的代码不是问题。

有没有办法解决此问题并重定向到任何域,还是必须使用var express = require("express"); var util=require("util"); var e = process.env; var config = { IP:e.OPENSHIFT_NODEJS_IP||"", Port:e.OPENSHIFT_NODEJS_PORT||80, TrustProxy:true, } var app = express(); app.set("trust proxy",config.TrustProxy) app.use(function(req,res,next){ var path=req.path.substr(1); if(path){ res.redirect(302,path); }else{ res.send(util.inspect(req)); } }); app.listen(config.Port,config.IP,function(){ console.log("Started"); }); 重定向?

服务器监听是一个简单的快速服务器:

colors.Where(c => !c.Equals("Red") && !c.Equals("Black")).ToList()

1 个答案:

答案 0 :(得分:0)

这与ProxyPassReverse在Apache中的工作原理直接相关。

OpenShift中的每个应用程序都定义了至少两个ProxyPassReverse指令 - 一个用于内部IP地址,另一个用于应用程序FQDN:

ProxyPassReverse / http://127.12.219.1:8080/
ProxyPassReverse / http://rsdbtest-abex.rhcloud.com/

在你的情况下,你还有几个,你定义的每个别名都有一个:

ProxyPassReverse / http://rsdb-test.tk/
ProxyPassReverse / http://sub.rsdb-test.tk/
ProxyPassReverse / http://sub.sub.rsdb-test.tk/
ProxyPassReverse / http://www.rsdb-test.tk/

只要您的应用程序返回重定向到其中一个主机,Apache就会重写主机部分以匹配原始请求中使用的主机头。那么,让我们举个例子:

http://rsdb-test.tk/http://sub.rsdb-test.tk/http://sub.sub.rsdb-test.tk/

您首先提出的请求如下:

GET /http://sub.rsdb-test.tk/http://sub.sub.rsdb-test.tk/ HTTP/1.1
Host: rsdb-test.tk

您的应用返回:

http://sub.rsdb-test.tk/http://sub.sub.rsdb-test.tk/

但ProxyPassReverse配置将其重写为:

http://rsdb-test.tk/http://sub.sub.rsdb-test.tk/

接下来,您将关注该重定向:

GET /http://sub.sub.rsdb-test.tk/ HTTP/1.1
Host: rsdb-test.tk

您的申请表返回:

http://sub.sub.rsdb-test.tk/

但同样,ProxyPassReverse将其重写为:

http://rsdb-test.tk/

当你删除尾部斜杠时,会发生第二次重定向有一个空的“path”元素,因此“ProxyPassReverse / ...”规则不再匹配,这是一个不幸的不一致。尽管它确实有效,但我认为它并没有完全符合您的预期,因为它向rsdb-test.tk发出了两个请求,然后是对sub.sub.rsdb-test.tk的请求(而您可能是期待rsdb-test.tk,然后是sub.rsdb-test.tk,然后是sub.sub.rsdb-test.tk)。

通常,重定向似乎按预期工作,并且我们没有任何简单的方法可以从您的应用程序中删除ProxyPassReverse设置。如果这种解释有意义,请告诉我。