Apache .htaccess 301将旧域重定向到新域,从托管根目录重定向到子文件夹,但为什么?

Apache .htaccess 301将旧域重定向到新域,从托管根目录重定向到子文件夹,但为什么?,apache,.htaccess,redirect,redirect-loop,Apache,.htaccess,Redirect,Redirect Loop,场景:我已将WordPress网站移动到新域,并希望301将所有页面从旧域重定向到新域。这两个站点位于运行Apache的同一主机帐户上。旧站点位于根级别(public_html),而新站点位于子文件夹中(根目录下/根目录内) 我已经设法做到了这一点,但我想学习并理解它为什么有效。下面是我的“旅程”和解决方案的简要概述,以及三个具体问题 首先,我尝试这样做重定向(添加到root.htaccess文件的代码): 但这会导致重定向循环。我猜是因为具有这些规则的.htaccess文件位于根级别,因此也会

场景:我已将WordPress网站移动到新域,并希望301将所有页面从旧域重定向到新域。这两个站点位于运行Apache的同一主机帐户上。旧站点位于根级别(public_html),而新站点位于子文件夹中(根目录下/根目录内)

我已经设法做到了这一点,但我想学习并理解它为什么有效。下面是我的“旅程”和解决方案的简要概述,以及三个具体问题

首先,我尝试这样做重定向(添加到root.htaccess文件的代码):

但这会导致重定向循环。我猜是因为具有这些规则的.htaccess文件位于根级别,因此也会影响子文件夹

问题1:我上面关于重定向循环原因的假设正确吗?

然后,我尝试更具体地将此代码放在root.htaccess文件中:

# 301 Page Redirects - not working - does nothing at all - not sure why 

redirect 301 https://old-domain.com/ https://new-domain.com/    
redirect 301 https://old-domain.com/services/ https://new-domain.com/services/  
redirect 301 https://old-domain.com/recipes/ https://new-domain.com/recipes/
我希望上面的代码能起到作用,因为它对旧域更为具体。我的想法是,它精确地指定了旧域,因此可以绕过重定向循环。但是相反,这个代码似乎没有任何效果。重定向循环消失了,但现在根本没有重定向发生

问题2:为什么上面的代码根本不会产生任何重定向?

然后,我找到并应用了其中的代码,该代码运行良好,并创建了所有重定向。另外,它比我之前的尝试要优雅得多。代码如下:

# 301 Redirects from old-domain.com to new-domain.com - THIS CODE WORKS - Yay!

RewriteEngine On
RewriteCond %{HTTP_HOST} ^old-domain.com$ [OR]
RewriteCond %{HTTP_HOST} ^www.old-domain.com$
RewriteRule (.*)$ https://new-domain.com/$1 [R=301,L]
问题3:为什么我将此代码放在root.htaccess中时,它不会导致任何重定向循环?


我意识到我在复制/粘贴代码,却没有完全理解它的工作原理。因此,我希望能对这些行为做出简单的解释。谢谢。

回答1:

根据您提供的信息,我想说不。您没有指定new-domain.com网站是否配置为(在apache配置中)文档根目录为public_root或public_root/子文件夹(根据所描述的行为判断,我认为是前者)。在这种情况下,当您请求
https://old-domain.com/anything
,服务器将(由于第一条规则中的无条件重定向)响应重定向到
https://new-domain.com/anything
。然后,客户端浏览器将请求该URL,它将命中相同的Apache和相同的.htaccess,这将再次导致相同的重定向,从而导致循环

答案2:

:

旧URL路径是一个区分大小写的(%-解码)路径,以 斜杠

在您的规则中,您将
[URL path]
指定为
https://old-domain.com/
,这是错误的:它可以是
/
/services/
/recipes
,但不能是
https://old-domain.com/
https://old-domain.com/services/
。请求
[URL路径]
与规则中指定的
[URL路径]
不匹配,因此不会发生重定向

答案3:

这与答案1中的第一条规则基本相同,但有一个重要区别:只有当请求中的主机名(或者更准确地说,请求中的
主机:
头的内容)等于
old domain.com
www.old-domain.com
,服务器才会响应重定向,这将阻止循环,因为客户端的第二个请求将使用
newdomain.com
hostname


此外,从上面看,子文件夹中的“新”网站似乎永远不会被服务:如果请求
old domain.com
new domain.com
,则将显示
public\u html
文件夹中的网站(并且只有客户端浏览器地址栏中的主机名会更改).

新旧站点的内容是否不同?新旧站点是完全相同的副本。所以这实际上是一个领域的变化。
# 301 Redirects from old-domain.com to new-domain.com - THIS CODE WORKS - Yay!

RewriteEngine On
RewriteCond %{HTTP_HOST} ^old-domain.com$ [OR]
RewriteCond %{HTTP_HOST} ^www.old-domain.com$
RewriteRule (.*)$ https://new-domain.com/$1 [R=301,L]
Redirect [status] [URL-path] URL