【问题标题】:Changing permalinks using mod_rewrite now gives internal server error 500现在使用 mod_rewrite 更改永久链接会导致内部服务器错误 500
【发布时间】:2013-08-22 18:51:09
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: regex wordpress mod-rewrite


    【解决方案1】:

    将规则改为

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

    【讨论】:

    • 完成拉维。仍然给我同样的 500 Internal Server Error
    • 是的,我发布的第一个代码有效。除了 site.com/2013/01/28 重定向到 site.com/28 并给出 404 错误
    • 好的,在确保第一个工作正常后,只需将其中的加号 + 更改为 {1,} 看看会发生什么。使用相同的源 url 来测试它们。
    • Ravi,我试过了,将最小字符数设置为 4 并且它起作用了。谢谢!
    • 那么{3,} 也可以。问题是+ 在您关闭} 之后是无效的,并且缺少$ 来标记字符串的结尾。您能否通过接受答案将此问题标记为已关闭?
    【解决方案2】:

    我不确定 %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

    【讨论】:

    • 当您的问题得到解决后,而不是发布 cmets 感谢人们(通常会在一段时间后被模组删除),您应该投票赞成有帮助的答案并接受您使用的答案或你觉得最好解决这个问题:meta.stackoverflow.com/help/someone-answers。您确实需要至少 15 个代表才能投票,所以在您拥有投票之前,您只能接受一个答案。但是请注意,您接受答案会获得 +2 代表,而您已经有 6 个代表,所以这会让您走到一半。
    • 谢谢阿迪。我现在增加了我的代表,并赞成你的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-22
    • 1970-01-01
    • 1970-01-01
    • 2018-05-10
    相关资源
    最近更新 更多