我想将旧域名中的一些 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,其中包含指向您想要推广的页面的附加链接。
参考: