首页 > 解决方案 > 重定向 301 规则不匹配后使用全局 RewriteRule

问题描述

去年,我们将一个大型站点从 oldsite.com 更改为 newsite.com。在此过程中,我们放置了一个全局 RewriteRule,其工作方式如下:

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

它在一年的大部分时间里运作良好。但谷歌在 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/ 和 ^/something$ 来查看是否可以匹配。有时它会将我重定向到https://newsite.com/newsite.com/new-thing/之类的内容。但通常它只是遵循全球规则。

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

第二个问题是,如何防止 ^(.*)$ 等其他模式覆盖它们?我还读到“L”标志与此有关,但似乎并没有什么不同。

我真诚地感谢这方面的帮助,它整天都在嘲笑我。

标签: .htaccess

解决方案


  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]

推荐阅读