在重定向301规则不匹配之后使用全局RewriteRule

时间:2018-12-19 20:31:18

标签: .htaccess

去年,我们将一个大型网站从oldsite.com更改为newsite.com。在此过程中,我们放置了一个如下所示的全局RewriteRule:

RewriteRule ^(.*)$ https://newsite.com/$1 [R=301,L]

在一年的大部分时间里效果很好。但是Google保留了oldsite.com上的一些旧记录,而路径却在newsite.com上改变了。因此,现在在Google搜索中找到原始URL时,他们访问了oldsite.com/example,并将其重定向到newsite.com/example,但实际URL现在为newsite.com/not-example。

我们在oldsite.com上放置了301个重定向,如下所示:

redirect 301 /something/ https://newsite.com/new-thing/

我确认,如果我们删除RewriteRule,则可以使用。但是,由于我们在旧站点上拥有3000多个URL,因此我们不能仅仅杀死这一全球规则。编写/生成可能会更改的3000多个URL也不是明智的选择。

我已经读到Redirect规则和RewriteRule在两个冲突的模块中,并且它们不能一起工作。因此,我开始测试作为RewriteRules的新规则。看起来像这样:

RewriteRule ^/something/ https://newsite.com/new-thing/ [R=301,L] 

我尝试了使用^(。)something /,^(。)/ something /和^ / someth $之类的东西来查看是否可以进行匹配。偶尔,它会将我重定向到https://newsite.com/newsite.com/new-thing/之类的地方。但通常它只是遵循这一全球规则。

第一个问题是,编写单个URL RedirectRule的正确方法是什么,甚至是明智的做法吗? (给我的印象是它们应该用于模式匹配,而不是单个URL)。

第二个问题是,如何防止其他模式(例如^(。*)$)被覆盖?我还读过“ L”标志与此有关,但似乎两者都没有什么不同。

我对此表示衷心的感谢,它整日困扰着我。

1 个答案:

答案 0 :(得分:0)

  1. 所有规则都使用相同的指令,即RewriteRule
  2. 在通用规则之前保留特定规则。

所以像这样:

RewriteEngine On

# known URI 1
RewriteRule ^/?something(/.*)?$ https://newsite.com/new-thing/ [R=301,L,NC]

# known URI 2
RewriteRule ^/?something-else(/.*)?$ https://newsite.com/new-thing2/ [R=301,L,NC]

# generic rule
RewriteRule ^(.*)$ https://newsite.com/$1 [R=301,L,NE]