301 重定向不适用于子页面,未找到错误

301 redirect not working for subpage, not found error

嗨,我有一些 URL 这样的

/dvr-model/110
/dvr-model/110/spider
/dvr-model/110/spencer
/dvr-model/110/whale/47

我是这样做的

 Redirect 301 /dvr-model/110 https://newurl
 Redirect 301 /dvr-model/110/spider https://newurl
 Redirect 301 /dvr-model/110/spencer https://newurl
 Redirect 301 /dvr-model/110/whale/47 https://newurl

现在第一个重定向工作正常,但所有其他 URL 都给出未找到错误。我在这里做错了什么?

but all other URLs are giving not found error.

具体来说,如果您请求 /dvr-model/110/spider,那么第一条规则会将请求重定向到 https://newurl/spider(大概是 404)。

Redirect 指令是 prefix-matching,匹配后的所有内容都被复制到目标 URL 的末尾。所以在上面的例子中 /spider 被附加到目标 URL.

的末尾

您需要反转规则,以便最具体的规则排在最前面,或者至少让第一个(通用)规则排在最后。

例如:

Redirect 301 /dvr-model/110/spider https://newurl
Redirect 301 /dvr-model/110/spencer https://newurl
Redirect 301 /dvr-model/110/whale/47 https://newurl
Redirect 301 /dvr-model/110 https://newurl

或使用 RedirectMatch,它使用正则表达式而不是简单的 prefix-matching 来匹配精确的 URL,例如:

RedirectMatch 301 ^/dvr-model/110$ https://newurl
RedirectMatch 301 ^/dvr-model/110/spider$ https://newurl
RedirectMatch 301 ^/dvr-model/110/spencer$ https://newurl
RedirectMatch 301 ^/dvr-model/110/whale/47$ https://newurl

可以使用正则表达式将其简化为单个规则交替:

RedirectMatch 301 ^/dvr-model/110(/spider|/spencer|/whale/47)?$ https://newurl

您需要在测试前清除浏览器缓存,并首先使用 302(临时)重定向进行测试以避免潜在的缓存问题。

参考: