现在使用mod_rewrite更改永久链接会使内部服务器错误500

时间:2013-08-20 16:01:30

标签: regex wordpress mod-rewrite

我刚刚将我的wordpress永久链接从domain.com/%year%/%month%/%post-slug%更改为domain.com/%post-slug%

我使用以下mod_rewrite规则将所有旧网址重定向到新网址。

RedirectMatch 301 ^/[0-9]{4}/[0-9]{2}/([a-z0-9\-/]+) http://www.site.com/$1

问题在于重定向所有基于日期的档案

domain.com/%year%/%month%/%date%

domain.com/%date%

也发出404错误。为了解决日期问题,我修改了上面的代码以包含字符数(最小3和最多300

RedirectMatch 301 ^/[0-9]{4}/[0-9]{2}/([a-z0-9\-/]{3,300}+) http://www.site.com/$1

但我现在得到500 Internal Server error

对此有任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

将规则更改为

RedirectMatch 301 ^/[0-9]{4}/[0-9]{2}/([a-z0-9/-]{3,})$ http://www.site.com/$1

答案 1 :(得分:1)

我不确定%post-slug%是什么样的,所以我不知道是否有更好的方法来区分它和%date%,但我推断%date%是一个2位数字,因此您可以使用负前瞻断言来排除它。此外,您可能希望使用 \ d 而不是 [0-9] (它们可以互换,但第一个更短)。

RedirectMatch 301 ^/\d{4}/\d{2}/(?!\d{2}$)([a-z0-9\-/]+) http://www.site.com/$1

这比检查字符数更可靠,除非您确定%post-slug%永远不会少于三个字符。当然,如果%post-slug%可能是一个2位数字,我建议的规则将跳过它。但在这种情况下,正则表达式无法区分它们。

另外,根据你写的内容,我假设在%date%之后没有任何结果。如果之后可能还有其他部分,请将规则更改为:

RedirectMatch 301 ^/\d{4}/\d{2}/(?!\d{2}($|/))([a-z0-9\-/]+) http://www.site.com/$2

(注意 $ 2 ,而不是 $ 1