我在Openshift在线上有一个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的请求对象。任何其他路径都会生成将Location头设置为路径的302,因此理论上,对http://rsdb-test.tk/http://sub.rsdb-test.tk的请求将带您到http://sub.rsdb-test.tk。这在本地工作,但是退出OpenShift的路由器后的位置是http://rsdb-test.tk。将该域替换为请求的域。如果您在本地运行服务器或从齿轮内卷曲,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");
});发布于 2016-03-05 02:51:13
这与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设置。如果这个解释有意义,请告诉我。
https://stackoverflow.com/questions/35795912
复制相似问题