htaccess 重定向与负先行

htaccess redirect with negative lookahead

我有一个 WordPress 博客,我需要迁移到另一个网站,我们将在其中使用 APIs 从 WordPress 后端获取数据。由于 WordPress 网站每个月的访问量都很大,我需要创建从 WordPress 到新网站的重定向。

旧URL结构

https://myblog.com/category/alias-of-the-article

新建URL结构

https://mynewwebsite.com/blog/alias-of-the-article

我在想有这样的东西:

RedirectMatch 301 "/(.*)/(.*)" "https://mynewwebsite.com/blog/"

但我仍然需要 APIs、图像以及“wp-content”文件夹下的所有内容保留在 myblog.com 网站上,因为我将从API.

是否为每个类别创建重定向是实现此目的的唯一方法?

"/category1/(.*)" "https://mynewwebsite.com/blog/"
"/category2/(.*)" "https://mynewwebsite.com/blog/"
...
"/category20/(.*)" "https://mynewwebsite.com/blog/"

如果新旧域指向同一个地方,那么您可能需要使用 mod_rewrite(RewriteRule / RewriteCond)而不是 mod_alias (RedirectMatch) 检查 Host header 以避免在新域中重定向 URL。

还建议不要混合来自两个模块的重定向,以避免意外冲突(mod_rewrite 首先运行,尽管配置文件中指令的顺序很明显)。

使用 mod_rewrite,您可以使用 条件RewriteCond 指令)来创建 例外情况,而无需在正则表达式中使用 negative lookaheads(如果你需要做很多例外,这可能会更复杂)。

尝试在根 .htaccess 文件的顶部,在任何现有的 WordPress 指令之前(即 before # BEGIN WordPress 部分)尝试以下操作。

例如:

RewriteCond %{HTTP_HOST} ^(www\.)?oldwebsite\.example [NC]
RewriteCond %{REQUEST_URI} !^/wp-content/
RewriteCond %{REQUEST_URI} !^/wp-json/
RewriteCond %{REQUEST_URI} !^/feed/
RewriteRule ^[^/.]+/([^/.]+)$ https://newwebsite.example/blog/ [R=302,L]

CondPattern上的!前缀(如!^/wp-content/)否定正则表达式,所以不匹配时成功。

如果您稍后需要使用反向引用,则只需要在正则表达式中使用带括号的子模式。因此,在上面的正则表达式中,似乎不需要捕获 catgeory.

注意:首先使用 302(临时)重定向进行测试,以避免潜在的缓存问题。只有在您确认它按预期工作后才更改为 301(永久)重定向。

RedirectMatch 301 "/(.*)/(.*)" "https://mynewwebsite.com/blog/"

这个正则表达式的一个问题是它匹配得太多了。 * 量词默认是贪心的,所以给定 /foo/bar/baz 形式的 URL,它将重定向到 /blog/baz。请参阅最近关于 greedy 正则表达式陷阱的问题:Unexpected behavior of a regex