代码之家  ›  专栏  ›  技术社区  ›  Rich Bradshaw

一个正则表达式来匹配任何不是以某个字符串开头的内容

  •  2
  • Rich Bradshaw  · 技术社区  · 14 年前

    我正在写一个修改规则,想用一只手让它做我想做的。

    基本上,我希望以下案例能够发挥作用:

    request | Redirect to
    ---------------------
    cheese  | /?page=cheese
    abc123  | /?page=abc123
    abc/def | /?page=abc/def
    a/b/c/d | /?page=a/b/c/d
    

    (任何字母数字加。-/并重新定向)

    有两种特殊情况:

    request | Redirect to
    ------------------------
    admin   | don't redirect
    media   | don't redirect
    

    有了这两个,我也不希望任何子目录等被重定向。

    我已经做到了:

    RewriteRule ^([A-Za-z0-9-_]+)/$ /index.php?page=$1 [L]
    

    但这只满足前两个测试。

    有什么想法吗?

    2 回复  |  直到 14 年前
        1
  •  2
  •   Lauri Lehtinen    14 年前

    我会创建一个单独的 早期的 规则(如Kobi所建议的)并使用 RewriteRule dash directive 以防止替代。

    破折号表示没有替换 应执行(现有路径 是通过未接触)。这是 当标志(见下文)需要 在不更改路径的情况下应用。

    ^index.php - [L]
    ^(admin|media) - [L]
    ^([A-Za-z0-9-_/\.]+)$ /?page=$1 [L]
    

    (我现在无法在我所在的位置测试这个,所以您可能需要稍微编辑一下-抱歉..但这个想法应该很清楚)

    在Apache 2.2上测试


    编辑:现在可以尝试这个-需要添加[L]使其工作。
    伊迪丝2:我意识到我没有回答完整的问题,为其他问题添加了规则。

        2
  •  1
  •   Kobi    14 年前

    如果您的版本支持它,您可以使用负向前看:

    ^(?!(?:admin|media)$)([A-Za-z0-9-_]+)/$
    

    现在,我不是系统管理员,但您可能有一个较早的规则来匹配 admin media 这可能是一个简单的想法。