通过.htaccess将旧域名重定向到新域



我正在使用Apache Mod Rewrite moduled及其.htaccess文件将旧域迁移到新域。我们有几乎相同的结构的新领域,其中包括

  1. URL
  2. 数据库

除了域名,它以前是www.oldurl.com,现在是www.newurl.com。这是我在旧域的.htaccess文件中的内容

RewriteEngine On
RewriteCond %{HTTP_HOST} ^oldurl.com$ [OR]
RewriteCond %{HTTP_HOST} ^www.oldurl.com$
RewriteRule (.*)$ http://www.newurl.com/$1 [R=301,L]

上面的设置似乎工作得很好,除了在一种情况下,我们在我的旧域中有几个URL,要么被删除,要么结构被更改,所以在这种情况下,上面的规则将不起作用

RewriteEngine On
RewriteCond %{HTTP_HOST} ^oldurl.com$ [OR]
RewriteCond %{HTTP_HOST} ^www.oldurl.com$
RewriteRule (.*)$ http://www.newurl.com/$1 [R=301,L]
Redirect 301 /my-page http://www.newurl.com/your-page

我总共有20多个这样的URL,我想知道我是否需要将所有20多个URL映射到新的URL,以及我是否需要注意它们在文件中的任何顺序。

我还想知道Apache将如何工作,它会查看每个映射的URL是否匹配吗?或者它以其他方式工作?

Redirect指令不会绑定到RewriteCond条件,并且始终将/my页面重定向到http://www.newurl.com/your-page此外,mod_rewrite优先于mod_alias,因此RewriteRule (.*)$ http://www.newurl.com/$1 [R=301,L]规则在查看Redirect指令之前应用。但是,如果.htaccess文件位于oldurl.comnewurl.com域的文档根目录中,则Redirect指令将在浏览器重定向到http://www.newurl.com/my-page,从而(再次)重定向到http://www.newurl.com/your-page

所以,这些东西的顺序并不重要,因为mod_rewrite是首先应用的。如果你有20个URL需要重定向到新网站上的新URL,你可以在它们自己的Redirect中枚举它们。否则,如果你不想让浏览器重定向两次,你可以使用mod_rewrite引擎来枚举它们:

RewriteEngine On
# redirect the changed URLs individually
RewriteCond %{HTTP_HOST} ^oldurl.com$ [OR]
RewriteCond %{HTTP_HOST} ^www.oldurl.com$
RewriteRule ^my-page$ http://www.newurl.com/your-page [R=301,L]
RewriteCond %{HTTP_HOST} ^oldurl.com$ [OR]
RewriteCond %{HTTP_HOST} ^www.oldurl.com$
RewriteRule ^my-page2$ http://www.newurl.com/your-page2 [R=301,L]
RewriteCond %{HTTP_HOST} ^oldurl.com$ [OR]
RewriteCond %{HTTP_HOST} ^www.oldurl.com$
RewriteRule ^my-page3$ http://www.newurl.com/your-page3 [R=301,L]
# Finally, redirect everything else as-is
RewriteCond %{HTTP_HOST} ^oldurl.com$ [OR]
RewriteCond %{HTTP_HOST} ^www.oldurl.com$
RewriteRule (.*)$ http://www.newurl.com/$1 [R=301,L]

请注意,这里的顺序确实很重要。必须重复HTTP_HOST的2个条件有点难看,你可能可以通过使用SKIP来绕过这一点,但最好只是重复它们。但是,如果您可以访问服务器配置或vhost-config,请查看RewriteMap指令,该指令允许您创建从旧url到新url的映射,并且您可以将所有单独更改的url重写减少为一个:

在你的服务器/vhost-config中,有这样的东西:

RewriteMap newurls txt:/path/to/file/map.txt

/path/to/file/map.txt将类似于:

my-page your-page
my-page2 your-page2
my-page3 your-page3
etc...

你的组合规则看起来像:

RewriteCond %{HTTP_HOST} ^oldurl.com$ [OR]
RewriteCond %{HTTP_HOST} ^www.oldurl.com$
RewriteRule ^(.*)$ http://www.newurl.com/${newurls:$1} [R=301,L]
RewriteCond %{HTTP_HOST} ^oldurl.com$ [OR]
RewriteCond %{HTTP_HOST} ^www.oldurl.com$
RewriteRule (.*)$ http://www.newurl.com/$1 [R=301,L]

最新更新