Openshift 302轧钢机
我在Openshift 302轧钢机,openshift,url-routing,Openshift,Url Routing,我在http://rsdbtest-abex.rhcloud.com/。它具有别名,并与以下域的CNAMEs相匹配: http://rsdb-test.tk/,http://www.rsdb-test.tk/,http://sub.rsdb-test.tk/,http://sub.sub.rsdb-test.tk/ 服务器设置为响应/express的请求对象。任何其他路径都会生成一个302,其中位置头设置为该路径,因此理论上是对的请求http://rsdb-test.tk/http://sub.
http://rsdbtest-abex.rhcloud.com/
。它具有别名,并与以下域的CNAME
s相匹配:
http://rsdb-test.tk/
,http://www.rsdb-test.tk/
,http://sub.rsdb-test.tk/
,http://sub.sub.rsdb-test.tk/
服务器设置为响应/
express的请求对象。任何其他路径都会生成一个302,其中位置
头设置为该路径,因此理论上是对的请求http://rsdb-test.tk/http://sub.rsdb-test.tk
将带您到http://sub.rsdb-test.tk
。这在本地工作,但是退出OpenShift路由器后的位置是http://rsdb-test.tk
。域将替换为请求的域。如果您在本地运行服务器或从设备内部运行curl,则位置
标题仍然正确,表明我的代码不是问题所在
是否有一种方法可以绕过此行为并重定向到任何域,或者我必须使用
来重定向
侦听的服务器是一个简单的express服务器:
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");
});
这与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/
http://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/http://sub.sub.rsdb-test.tk/
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设置。让我知道这个解释是否有道理。我刚刚在Firefox中试用过,它的工作原理与您描述的一样。它似乎是间歇性的。截至编写<代码>http://rsdb-test.tk/http://sub.rsdb-test.tk/http://sub.sub.rsdb-test.tk/重定向不正确,再次删除子域。因此,如果
位置
标题以/
结尾,则位置会被损坏,否则就可以了。感谢您的详细解释,我怀疑它是ProxyPassReverse,但我找不到关于路由层工作原理的文档。现在我已经换成了元刷新,这对我的情况很有效,但是如果元刷新不是一个选项,那么有一种方法绕过它会很好。