Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Openshift 302轧钢机_Openshift_Url Routing - Fatal编程技术网

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,但我找不到关于路由层工作原理的文档。现在我已经换成了元刷新,这对我的情况很有效,但是如果元刷新不是一个选项,那么有一种方法绕过它会很好。