我在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()
答案 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设置。如果这种解释有意义,请告诉我。