Htaccess重定向循环问题

时间:2018-03-12 16:59:30

标签: regex .htaccess redirect mod-rewrite

由于特殊原因,我在父网站中托管子网站,并希望为子网站使用域别名。为清楚起见,我们将两个域称为parent.org和child.org。

子网站位于:parent.org/child

由于child.org是域别名,因此它也位于:child.org/child

我想建立重定向,将任何请求路由到child.org或parent.org/child到child.org/child

搜索论坛时,我尝试了很多东西,虽然这个似乎与我的目标最接近:

RewriteCond %{HTTP_HOST} ^(www.)?child\.org$ [NC]
RewriteCond %{REQUEST_URI} !^/child/.*$ [NC]
RewriteRule ^(.*)$ http://child.org/child/$1 [R=302,L,NS]

RewriteCond %{HTTP_HOST} ^(www.)?parent\.org/child$ [NC]
RewriteRule ^(.*)$ http://child.org/child/$1 [R=302,L,NS]

这并不像希望的那样有效,导致child.org/child/child/child/etc。

我在这里缺少什么?

附录: 为了帮助澄清我的目标,对于任一域,如果“/ child”不是URL的第一部分,我想使用parent.org。如果“/ child”不是URL的第一部分,我想使用child.org。所以:

Parent setup:
parent.org/foo ->  parent.org/foo
parent.org/child/foo -> child.org/child/foo

Child setup:
child.org -> child.org/child
child.org/foo -> parent.org/foo
child.org/child/foo -> child.org/child/foo

1 个答案:

答案 0 :(得分:1)

首先RewriteCond %{HTTP_HOST} ^(www.)?parent\.org/child$ [NC]是错误的,因为%{HTTP_HOST}代表parent.orgchild.org,而后跟uri无法匹配。

我认为您对child.org没有任何问题,因为它已经在domain alias之前完成,这意味着child.org的请求会显示child中的所有内容目录除非你做另一个配置。

因此,您的代码应如下所示,仅在涉及父域时重定向:

RewriteCond %{HTTP_HOST} ^(www\.)?parent\.org$ [NC]
RewriteCond %{REQUEST_URI} ^/child/(.*)$ [NC]
RewriteRule ^child/(.*)$ http://child.org/$1 [R=302,L]

因此,此部分parent.org/child/已配置为child.org,因此任何包含parent.org/child/whatever的请求都将为child.org/whatever

更新:您已经由于child.org是域名别名,因此它也位于:child.org/child ,如果是这样,代码应该是这样的:

RewriteCond %{HTTP_HOST} ^(www\.)?parent\.org$ [NC] 
RewriteCond %{REQUEST_URI} ^/child/(.*)$ [NC]
RewriteRule ^(.*)$ http://child.org/$1 [R=302,L]

RewriteCond %{HTTP_HOST} ^(www\.)?child\.org$ [NC]
RewriteCond %{REQUEST_URI} !^/child/(.*)$ [NC]
RewriteCond %{REQUEST_URI} !^/?$ 
RewriteRule ^(.*)$ http://parent.org/$1 [R=302,L]

RewriteCond %{HTTP_HOST} ^(www\.)?child\.org$ [NC]
RewriteCond %{REQUEST_URI} !^/child/(.*)$ [NC]
RewriteCond %{REQUEST_URI} ^/?$ 
RewriteRule ^(.*)$ http://child.org/child/$1 [R=302,L]

因此,对parent.org/child/whatever的任何请求都将重定向到child.org/child/whatever

然后,对child.org/whatever以及child以外的所有内容的任何请求都将被重定向到parent.org/whatever

最后,对child.org的任何请求都将重定向到child.org/child/