如何不匹配mod_rewrite中的单词

Joh*_*ohn 10 regex mod-rewrite

请帮忙,我疯了!

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

这是我目前的代码.有时人们会访问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]
Run Code Online (Sandbox Code Playgroud)

我对regex/mod_rewrite不是很好,但我上面的东西应该有用吗?我只需要一个AND运算符清楚且不起作用,但我找不到一个!

提前谢谢了.

Gum*_*mbo 10

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

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

或者从Apache 2开始,您也可以使用否定的预见断言:

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

除此之外,您还可以使用QSA标志,而不是手动附加QUERY_STRING.请注意,您当前的模式也会允许类似的东西/foobarsearch/,因此它没有分离/.