.htaccess - 重定向 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”标志与此有关,但似乎并没有什么不同。
我真诚地感谢这方面的帮助,它整天都在嘲笑我。
解决方案
- 让所有规则都使用相同的指令,即
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]
推荐阅读
- python - 如何使用 python 将图像中的人脸保存到 AWS Rekognition 上的集合中
- svelte - How is the script tag scoped for individual pages in Svelte/Sapper?
- react-native - 在本机反应中使用多行自动增长文本输入
- python - 为python的人脸识别设置训练数组尺寸
- java - 需要在 Amazon Java SDK 的 putObject() 之后关闭 InputStream?
- sql - 如何在 SQL 中将 varchar 转换为图像数据类型?
- powershell - 尝试加载 powershell 库失败
- r - 将单选按钮链接到闪亮的反应数据
- ruby-on-rails - ActiveStorage 上传大型 base64 编码字符串?
- security - 如何保护php中的密码字段