htaccess:301 将定义的 URL 重定向到新域名,并捕获所有重定向其余内容

htaccess:301 将定义的 URL 重定向到新域名,并捕获所有重定向其余内容

我想将旧域名中的一些 URL 重定向到新域名上的新版本。旧域名使用 www. 子域名和 SSL。

例如:

  • 旧域名.com/audi -> 新域名.com/cars/audi
  • 旧域名.com/bmw -> 新域名.com/cars/bmw

但是旧域名上也有很多页面/URL 没有新版本。对于这些页面和所有带有 www. 子域名的 URL,我想使用“全部捕获”重定向到主页。

这是我现在正在使用的:

# redirect specific pages
RewriteEngine on
Redirect 301 /audi https://www.newdomain.de/cars/audi/

#redirect everything else
RewriteRule ^(.*)$ http://www.newdomain.de/ [R=301,L]

不幸的是,它不起作用,所有页面都被重定向到主页。

答案1

Redirect是 mod_alias 指令(与 无关RewriteEngine)。RewriteRule属于 mod_rewrite。无论配置文件中的指令顺序如何,mod_rewrite 始终先被处理。因此,您不应混合使用来自两个模块的重定向,因为您可能会因处理顺序而得到意外结果。

你要么需要对一切使用 mod_rewrite。例如:

RewriteEngine on

# Redirect specific pages
RewriteRule ^audi$ https://www.newdomain.de/cars/audi [R=301,L]

# Redirect everything else
RewriteRule ^ http://www.newdomain.de/ [R=301,L]

您可以将/audi/bmw重定向组合在一个指令中。例如:

RewriteRule ^(audi|bmw)$ https://www.newdomain.de/cars/$1 [R=301,L]

$1对捕获组的反向引用在哪里RewriteRule 图案

或者,对所有内容使用 mod_alias(前提是没有其他冲突)。例如:

# Redirect specific pages
Redirect 301 /audi https://www.newdomain.de/cars/audi

# Redirect everything else
RedirectMatch 301 ^/ http://www.newdomain.de/

我删除了目标 URL 上的斜线,因为它在您的示例中不存在。

请注意,我们需要使用RedirectMatch(也是 mod_alias 指令)来进行“其他所有内容”重定向,因为它Redirect是前缀匹配,否则会重定向到目标(而不是主页)的相同 URL。

如上所述,Redirect是前缀匹配,因此第一个Redirect指令实际上会重定向/audi/something/cars/audi/something。如果这是问题,则改用RedirectMatch

您应该首先使用 302(临时)重定向进行测试以避免潜在的缓存问题,并且您需要在测试之前清除浏览器(和任何中间)缓存,因为错误重定向到主页很可能已被浏览器缓存。

在旁边:请注意,搜索引擎(尤其是 Google)可能会将大量重定向到主页视为软 404。这通常是可取的(对于搜索引擎和用户) 来提供更有意义的自定义 404,其中包含指向您想要推广的页面的附加链接。

参考:

相关内容