如何不匹配mod_rewrite中的单词

时间:2010-10-21 11:58:00

标签: regex mod-rewrite

请帮助,我疯了!

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运算符清楚&不起作用,但我找不到一个!

非常感谢提前。

3 个答案:

答案 0 :(得分:10)

您有两种选择:使用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/之类的内容,因此它没有/分隔。

答案 1 :(得分:3)

不完全“不匹配单词” - 但您可以在重写时添加条件以说“如果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

答案 2 :(得分:1)

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

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

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

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