【问题标题】:Htaccess Redirect Loop IssueHtaccess 重定向循环问题
【发布时间】:2018-03-12 16:59:29
【问题描述】:

出于特殊原因,我在父网站中托管了一个子网站,并希望为该子网站使用域别名。为清楚起见,我们将这两个域称为 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

【问题讨论】:

  • 所以请求,child.org/whatever,如果不是孩子,它应该被重定向到 parent.org/whatever 对吗?
  • 没错。有点可笑,我知道。

标签: regex .htaccess redirect mod-rewrite


【解决方案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

更新:你 siad 由于 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/

【讨论】:

  • 感谢您的回复!这给了我一些清晰度,但我这并不能完全解决问题。也许我可以更清楚地描述它——我会在原帖中添加。
  • 哇,我们进步了!以下方面有效: parent.org/foo -> parent.org/foo child.org/foo -> parent.org/foo 这些方面一开始似乎有效,在浏览器中返回预期的正确 URL:parent.org /child/foo -> child.org/child/foo child.org -> child.org/child child.org/child/foo -> child.org/child/foo 但是页面本身会抛出“ERR_TOO_MANY_REDIRECTS”。当它到达 child.org/child 时,是否还有东西在循环?我可以确认 htaccess 文件中没有其他干扰重定向。
  • @Marcus 我在开头添加了 RewriteCond %{HTTP_HOST} ^(www\.)?parent\.org$ [NC] ,所以清除浏览器缓存然后再次测试
  • 感谢您的更新!这让我走得很远——我已经注释掉了第二个块,它停止了任何“重定向太多”的错误,并且满足除一个之外的所有条件:child.org/foo -> parent.org/foo。我已经尝试重新排列和修改第二个块,但我无法让它与其他两个块一起玩。
猜你喜欢
  • 2017-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多