去年,我们将一个大型网站从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”标志与此有关,但似乎两者都没有什么不同。
我对此表示衷心的感谢,它整日困扰着我。
答案 0 :(得分:0)
RewriteRule
。所以像这样:
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]