2010-10-21 54 views
9

請幫忙,我要瘋了!如何不匹配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 ^(!products&[a-z0-9_-]+)?/?search/?$ search.php?id=$1&%{QUERY_STRING} [NC,L] 

我用regex/mod_rewrite不是很好,但是我上面的東西應該可以工作嗎?我只需要一個AND運算符,清楚&不起作用,但我找不到一個!

非常感謝提前。

回答

9

你有兩種選擇:要麼使用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/之類的內容,因此它沒有分隔/

+0

謝謝大家的幫助!因爲我使用了[L]標誌,所以我最終只是把產品線放在第一位。 – John 2010-10-21 13:19:16

2

不完全是「不匹配詞」 - 但你可以重寫添加一個條件說「如果網址不符合這種模式」

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

1

如果mod_rewrite的支持向前看符號,你可以使用

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

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

該部分(?!products)告訴正則表達式引擎向前看,如果發現「產品」失敗。