【问题标题】:.htaccess 301 redirect old to new domain, from hosting root to subfolder, working but why?.htaccess 301 将旧域重定向到新域,从托管根目录到子文件夹,但为什么?
【发布时间】:2018-07-10 09:50:33
【问题描述】:

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

我已经成功地完成了这项工作,但我想了解并了解它为什么有效。下面是我的“旅程”和解决方案的快速概述,以及三个具体问题。

首先我尝试像这样进行重定向(代码添加到根 .htaccess 文件中):

# 301 Page Redirects - not working - causes redirect loop

redirect 301 /  https://new-domain.com/     
redirect 301 /services/ https://new-domain.com/services/    
redirect 301 /recipes/  https://new-domain.com/recipes/ 

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

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

然后我尝试更具体,并将此代码放在根 .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:为什么上面的代码根本不会产生任何重定向?

然后我找到了this answer 并应用了其中的代码,它完美地工作并创建了所有重定向。另外,它比我之前的尝试优雅得多。这是代码:

# 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:为什么我将这段代码放在根 .htaccess 中时不会导致任何重定向循环?

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

【问题讨论】:

  • 新旧网站内容不同吗?
  • 新旧站点是完全复制的。所以这实际上是域的变化。

标签: apache .htaccess redirect redirect-loop


【解决方案1】:

答案 1:

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

答案 2:

Redirect syntax:

Redirect [status] [URL-path] URL

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

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

答案 3:

这与答案 1 中的第一条规则基本相同,但有一个重要区别:服务器仅在请求中的主机名(或更准确地说,Host: 标头的内容)时才会响应重定向in request) 等于old-domain.comwww.old-domain.com,这将防止循环,因为来自客户端的第二个请求将使用new-domain.com 主机名。

此外,从上面看,似乎永远不会提供子文件夹中的“新”网站:如果请求 old-domain.comnew-domain.com,则将显示来自 public_html 文件夹的站点(并且仅显示主机名在客户端浏览器地址栏中将更改)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-26
    • 2013-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多