【问题标题】:How to NOT match a word in mod_rewrite如何不匹配 mod_rewrite 中的单词
【发布时间】:2011-04-28 13:55:24
【问题描述】:

请帮忙,我快疯了!

RewriteRule ^([a-z0-9_-]+)?/?search/?$ search.php?id=$1&%{QUERY_STRING} [NC,L]

这是我当前的代码。有时人们会访问 mysite.com/search,有时他们会访问 mysite.com/boris/search,而我检测到用户的检查结果为空($_GET['id'])。

但是我正在创建另一个搜索,mysite.com/products/search 会导致 products_search.php

我需要我的原始 RewriteRule 来匹配除“产品”一词之外的任何用户。

我尝试了很多组合。

RewriteRule ^(!products&[a-z0-9_-]+)?/?search/?$ search.php?id=$1&%{QUERY_STRING} [NC,L]

我对 regex/mod_rewrite 不太擅长,但我上面的方法应该可以吗?我只需要一个 AND 运算符,显然 & 不起作用,但我找不到!

非常感谢。

【问题讨论】:

    标签: regex mod-rewrite


    【解决方案1】:

    您有两个选择:使用RewriteCond 来限制已经匹配的字符串:

    RewriteCond $1 !=products
    RewriteRule ^([a-z0-9_-]+)?/?search/?$ search.php?id=$1&%{QUERY_STRING} [NC,L]
    

    或者从 Apache 2 开始,您还可以使用否定的前瞻断言:

    RewriteRule ^(?!products/)([a-z0-9_-]+)?/?search/?$ search.php?id=$1&%{QUERY_STRING} [NC,L]
    

    除此之外,您还可以使用QSA flag 而不是手动附加QUERY_STRING。请注意,您当前的模式也将允许/foobarsearch/ 之类的内容,因此它没有分隔/

    【讨论】:

    • 谢谢大家的帮助!因为我使用了 [L] 标志,所以我最终只是将产品线放在首位。
    【解决方案2】:

    不完全是“不匹配一个词”——但您可以在重写时添加一个条件来表示“如果 URL 与此模式不匹配”​​

    RewriteCond %{REQUEST_URI} !^/products
    RewriteRule ^([a-z0-9_-]+)?/?search/?$ search.php?id=$1&%{QUERY_STRING} [NC,L]
    

    这通常是执行此类操作的最常见方式 - 因为条件也可以链接在一起。

    您可以在此处找到有关 RewriteCond 的更多信息:- http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritecond

    【讨论】:

      【解决方案3】:

      如果 mod_rewrite 支持前瞻,你可以使用

      RewriteRule ^(?!products)([a-z0-9_-]+)?/?search....
      

      根据to this question on serverfault.com 更新版本。

      (?!products) 部分告诉正则表达式引擎向前看,如果找到“产品”则失败。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-05
        相关资源
        最近更新 更多