繁体   English   中英

.htaccess 301将旧域名重定向到新域,从托管根目录到子文件夹,可以运行,但是为什么呢?

[英].htaccess 301 redirect old to new domain, from hosting root to subfolder, working but why?

场景:我已将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:为什么上述代码根本不会产生任何重定向?

然后,我找到了这个答案,并从中应用了代码,该代码可以完美地工作并创建所有重定向。 此外,它比上面我之前的尝试要优雅得多。 这是代码:

# 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根目录中时,为什么此代码不会引起任何重定向循环?

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

答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 [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]在您的规则中指定,所以重定向从未发生过。

答案三:

这基本上与答案1中的第一个规则具有相同的作用,但有一个重要的区别:仅当请求中的主机名(或更确切地说,请求中的Host:标头的内容)为等于old-domain.comwww.old-domain.com ,这将阻止循环,因为来自客户端的第二个请求将使用new-domain.com主机名。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM