【问题标题】:htaccess 301 redirects with multiple domain RewriteCond and RewriteRulehtaccess 301 使用多个域 RewriteCond 和 RewriteRule 重定向
【发布时间】:2012-04-22 20:38:10
【问题描述】:

我正在尝试将旧域的所有页面重定向到新域上有关该域的页面。

我使用下面代码的前 3 行构建了无数网站,这些代码将任何不是 www.mydomain.co.uk 的内容重定向到 www.mydomain.co.uk。

在以下 4 行中,我试图将 olddomain.co.uk 的所有页面重定向到我的新域 www.currentdomain.co.uk/page-about-olddomain 上的单个页面

RewriteCond   %{HTTPS} !=on
RewriteCond   %{HTTP_HOST}   !^www\.currentdomain\.co\.uk$   [NC]
RewriteRule   ^(.*)$   http://www.currentdomain.co.uk/$1  [R=301,L]

RewriteCond   %{HTTPS} !=on
RewriteCond   %{HTTP_HOST}   ^www\.olddomain\.co\.uk$   [NC]
RewriteCond   %{HTTP_HOST}   ^olddomain\.co\.uk$   [NC]
RewriteRule   ^(.*)$  http://www.currentdomain.co.uk/page-about-olddomain  [R=301,L]

我想要发生的事情

我希望从上面的代码中看到页面 www.olddomain.co.uk/test-page 将重定向到 www.currentdomain.co.uk/page- about-olddomain.

实际发生的情况

我实际上看到的是页面 www.olddomain.co.uk/test-page 重定向到 www.currentdomain.co.uk/test-page。

我认为这是两组 RewriteConds 之间的冲突

对此的任何帮助我将不胜感激,我相信还有其他人想做类似的事情。

谢谢

【问题讨论】:

  • 为什么需要前三行?
  • 如果在没有 www(例如currentdomain.co.uk)或使用备用域(currentdomain.com)的情况下访问该站点,则前 3 行重定向到 www.currentdomain.co.uk
  • 好的,在这种情况下@LazyOne 的答案应该是正确的。

标签: .htaccess mod-rewrite redirect multiple-domains


【解决方案1】:

感谢 @LazyOne,我通过 交换规则的顺序 解决了这个问题,并在第一个 RewriteCond 之后添加了 [OR] 条件检查带有 www 的旧域

RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP_HOST} ^www\.olddomain\.co\.uk$   [NC,OR]
RewriteCond %{HTTP_HOST} ^olddomain\.co\.uk$   [NC]
RewriteRule ^(.*)$ http://www.currentdomain.co.uk/olddomain-page [R=301,L]

RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP_HOST} !^www\.currentdomain\.co\.uk$   [NC]
RewriteRule ^(.*)$ http://www.currentdomain.co.uk/$1  [R=301,L]

【讨论】:

    【解决方案2】:

    规则的顺序很重要。交换它们——将第一条规则(第 1-3 行)移到第 2 条之下。

    RewriteCond %{HTTPS} !=on
    RewriteCond %{HTTP_HOST} ^www\.olddomain\.co\.uk$ [NC]
    RewriteCond %{HTTP_HOST} ^olddomain\.co\.uk$ [NC]
    RewriteRule ^(.*)$  http://www.currentdomain.co.uk/page-about-olddomain [R=301,L]
    
    RewriteCond %{HTTPS} !=on
    RewriteCond %{HTTP_HOST} !^www\.currentdomain\.co\.uk$ [NC]
    RewriteRule ^(.*)$ http://www.currentdomain.co.uk/$1 [R=301,L]
    

    【讨论】:

    • 您好,感谢您的回答。恐怕这没有奏效。一开始我确实有这样的规则。我只是仔细检查了一下,无论这两条规则的顺序如何,我都会得到相同的结果。
    • 然后进行一些调试——删除%{HTTPS} 行,同时删除非 www 到 www 规则——可能(最可能的原因——我现在没有其他选择)你做了一个拼写/转义旧域名时出错,显然该规则因无法匹配域名而被跳过。
    • 我已经删除了 HTTPS 行以及非 www 到 ww 规则。请看代码,我已经用假人RewriteCond %{HTTP_HOST} ^www\.olddomain\.co\.uk$ [NC] RewriteCond %{HTTP_HOST} ^olddomain\.co\.uk$ [NC] RewriteRule ^(.*)$ http://www.newdomain.co.uk/olddomain-page [R=301,L] 替换了实际的域名,但这仍然会产生相同的结果。感谢您的帮助
    • OK .. 让我们看看%{HTTP_HOST} 有什么:1)删除第一条规则(从我的回答中)并更改最后一条(目标 URL + 标志):http://www.currentdomain.co.uk/$1?host=%{HTTP_HOST} [R=302,L]——这应该可以帮助你查看该变量实际具有的值。 2)在测试时——使用新的未使用过的 URL(或清除所有缓存并重新启动浏览器),因为现代浏览器会缓存 301 重定向,因此您可能只会看到 OLD 缓存的重定向(甚至没有发送到服务器)虽然新规则仍然有效。
    • 我已经通过在使用 WWW 的旧域检查之后添加 [OR] 条件来使其工作。再次感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-13
    • 2013-03-14
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 2013-08-10
    • 1970-01-01
    相关资源
    最近更新 更多