redirect到.htaccess中的绝对URL会在OpenShift上返回错误的主机名

我正在OpenShift上build立一个网站。 它在Apache 2.2.15下运行,但我没有访问Apache根目录或日志,所以我试图模拟我的网站根目录下的.htaccess文件中的虚拟目录。 它大部分工作正常,但有一个redirect问题,我不明白。

该网站的结构是这样的:

app-root / repo – .htaccess所在的站点根目录
应用根/回购/ domain_example
app-root / repo / domain_example / main – 主网站(WordPress)

在WordPress中,我的博客在www.example.com/blog下,但在迁移到WordPress之前,我在blogs.example.com子域中有几篇文章。 为了维护链接,我在.htaccess中设置了redirect命令。 他们在我的旧共享主机提供商工作得很好。 他们甚至我将OpenShift别名添加为www.example.com 之前在OpenShift上工作得很好。 但是,由于添加别名,我不能强制.htaccess返回www。 如果原始主机名以博客开头。

从Apache Redirect文档 :

新的URL应该是一个以scheme和hostname开头的绝对URL。 在Apache HTTP Server 2.2.6及更高版本中,也可以使用以斜杠开头的URLpath,在这种情况下,将添加当前服务器的scheme和主机名。 然后,以URL-path开头的任何请求都会将redirect请求返回到目标URL位置的客户端。

我期望的是:如果我提供绝对URL作为目标,redirect应该将该URL返回给客户端。 客户端然后可以使用正确的URL重新发出请求。

发生了什么:redirect正在发生(我在Firebug中看到了302),但它指向的是源域,而不是目标。 这就像是在做第二点(使用“当前服务器的scheme和主机名称”),即使我提供了一个绝对的URL。

这里是我的.htaccess的摘录:

Options +FollowSymLinks -MultiViews RewriteEngine On RewriteBase / # This section from https://my.bluehost.com/cgi/help/347#redirect RewriteCond %{HTTP_HOST} ^(www.)?example\.com$ RewriteCond %{REQUEST_URI} !^/domain_example/ RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ /domain_example/main/$1 RewriteCond %{HTTP_HOST} ^(www.)?example\.com$ RewriteRule ^(/)?$ domain_example/main/index.php [L] # blogs.example.com redirects redirect 302 /mark/post/Check-Windows-Time-Settings.aspx http://www.example.com/blog/2010/05/check-windows-time-settings/ 

使用.htaccess,当我浏览http://blogs.example.com//mark/post/Check-Windows-Time-Settings.aspx并在Firebug中查看响应时,我看到302redirect将会转到http ://blogs.example.com/blog/2010/05/check-windows-time-settings/ 。 但是这并不存在,所以我得到了404 Not Found。 为什么要去博客。 当我告诉它去www。

我想知道,如果OpenShift别名是重写redirect,但根据redirect文档:

redirect指令优先于Alias和ScriptAlias指令,与configuration文件中的顺序无关。

我也尝试添加一个显式的陷阱,并重写一个以blogs.example.com/blog/开头的path(这是redirect显然返回的):

 RewriteCond %{HTTP_HOST} ^blogs\.example\.com/blog/ [NC] RewriteRule ^(.*)$ http://www.example.com/blog/$1 [L,R=302] 

我仍然得到404没有find。 实际上,即使是最基本的URL, http://blogs.example.com/blog/也会提供一个404。

如何在这种情况下redirect工作?

2015年5月27日更新#1

在Rewrite块中使用“not”逻辑尝试:

 RewriteCond %{HTTP_HOST} !^www\.example\.com/blog/ [NC] RewriteRule ^(.*)$ http://www.example.com/blog/$1 [L,R=302] 

这导致无限的redirect循环,20个redirect之前,它放弃。 每个redirect仍然以http://blogs.example.com开头,所以仍然阻止了RewriteRule在URL的开始处写入“www”。

相同的结果,如果我终止非逻辑$

 RewriteCond %{HTTP_HOST} !^www\.example\.com/blog/$ [NC] RewriteRule ^(.*)$ http://www.example.com/blog/$1 [L,R=302] 

2015年5月27日更新#2

@Quasidynamic指出,%(HTTP_HOST)只包含主机名,之后没有任何内容。 所以我试着只select以www.example.com/blog开头的url:

 RewriteCond %{HTTP_HOST} ^blogs\.example\.com$ [NC] RewriteCond %{REQUEST_URI} ^/blog/$ [NC] RewriteRule ^(.*)$ http://www.example.com/blog/$1 [R=302,L] 

没有无限循环,但redirect仍然是blogs. ,那么重写失败将其发送到www.

2015年5月28日更新

Per @ Quasidynamic的请求,尝试这个块:

 RewriteCond %{HTTP_HOST} ^blogs\.example\.com$ [NC] RewriteRule ^(.*)$ http://www.example.com/blog/$1 [R=302,L] 

正如现在所预期的,当我浏览到blogs.example.com ,它被redirect到blogs.example.com/blog/ 。 因为它仍然匹配RewriteCond,所以它被redirect到blogs.example.com/blog/blog/ 。 无限广告。 它从来没有去过www.example.com ,这是我从一开始就遇到的根本问题:一旦我将blogs.example.com添加为OpenShift子域,我就不能再使用.htaccessredirect到www.example.com不pipe我尝试什么。

如果您的[old]是blogs.example.com,[target]是www.example.com/blog:

RewriteCond %{HTTP_HOST} blogs.example.com$ RewriteRule ^(.*)$ http://www.example.com/blog/ $1 [R=301,L]

你很接近,但你试图匹配/博客的请求,不会在那里,只是在[目标]网站,因为我了解你的情况。

使用代码301 – “状态301意味着资源(页面)永久移动到一个新的位置。客户端/浏览器不应该尝试请求原始位置,而是从现在开始使用新的位置。 从

https://stackoverflow.com/questions/1393280/http-redirect-301-permanent-vs-302-temporary