首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Openshift 302故障

Openshift 302故障
EN

Stack Overflow用户
提问于 2016-03-04 12:19:23
回答 1查看 793关注 0票数 0

我在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>来重定向?

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

代码语言:javascript
复制
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");
});
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-05 02:51:13

这与ProxyPassReverse在Apache中的工作方式直接相关。

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

代码语言:javascript
复制
ProxyPassReverse / http://127.12.219.1:8080/
ProxyPassReverse / http://rsdbtest-abex.rhcloud.com/

在您的例子中,您还有几个别名,每个别名都有一个:

代码语言:javascript
复制
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将重写主机部分以匹配原始请求中使用的主机头。那么,让我们以这个例子为例:

代码语言:javascript
复制
http://rsdb-test.tk/http://sub.rsdb-test.tk/http://sub.sub.rsdb-test.tk/

您首先提出如下请求:

代码语言:javascript
复制
GET /http://sub.rsdb-test.tk/http://sub.sub.rsdb-test.tk/ HTTP/1.1
Host: rsdb-test.tk

您的应用程序返回:

代码语言:javascript
复制
http://sub.rsdb-test.tk/http://sub.sub.rsdb-test.tk/

但是ProxyPassReverse配置将此重写为:

代码语言:javascript
复制
http://rsdb-test.tk/http://sub.sub.rsdb-test.tk/

接下来,您将遵循重定向:

代码语言:javascript
复制
GET /http://sub.sub.rsdb-test.tk/ HTTP/1.1
Host: rsdb-test.tk

您的应用程序返回:

代码语言:javascript
复制
http://sub.sub.rsdb-test.tk/

但是,ProxyPassReverse再次将其重写为:

代码语言:javascript
复制
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设置。如果这个解释有意义,请告诉我。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35795912

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档