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
我有一个 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