【问题标题】:Simple regex does not work in htaccess简单的正则表达式在 htaccess 中不起作用
【发布时间】:2026-02-12 13:45:02
【问题描述】:

看起来像一个简单的问题。但我就是不明白:

这条 htaccess 规则确实有效:

RewriteEngine On
RewriteRule ^m(.+)$ ?s=$1

但这不是:

RewriteEngine On
RewriteRule ^(.+)$ ?s=$1

它返回一个内部服务器错误。那个正则表达式有什么问题?为了工作应该改变什么?

【问题讨论】:

    标签: regex .htaccess url-rewriting


    【解决方案1】:

    我不知道“不起作用”的确切含义,但我认为它可能会陷入重写循环。

    试试这个:

    RewriteEngine On
    RewriteCond %{REQUEST_URI} !^?s=
    RewriteRule ^(.+)$ ?s=$1
    

    我没有对此进行测试,但它应该只在尚未添加 ?s 参数的情况下重写。

    【讨论】:

    • 它不起作用。我使用RewriteRule ^([a-z]+)$ ?s=$1 解决了它——或者更准确地说,解决了它(所以点从正则表达式中消失了)。但问题仍然存在:为什么^(.+)$ 不起作用?
    • 可能是同样的原因,点还包括 ?= 部分,所以它会尝试不断重写它(使其成为 ?s=?s=、?s=?s=?s= 等)。通过将其限制为以字母开头的 URI,它排除了 ?,基本上与我尝试做的相同。
    • 我也想我知道我做错了什么,我应该逃脱? (在正则表达式中具有特殊功能)。
    • 但是^([^?]+)$ ?s=$1 也不起作用。我应该工作,不是吗?我试图否定角色?。我该如何解决?
    • 嗯,对不起。我现在无法测试任何东西,所以我不知道如何解决它。
    【解决方案2】:

    哦,我刚刚意识到您还可以在 RewriteConds 中查找实际的查询字符串。你可以试试:

    RewriteEngine On
    RewriteCond %{QUERY_STRING} !s=
    RewriteRule ^(.+)$ ?s=$1
    

    【讨论】: