2010-10-21 19 views
9

Per favore aiuto, sto impazzendo!Come NON abbinare una parola in mod_rewrite

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

Questo è il mio codice corrente. A volte le persone visitano mysite.com/search, altre volte visitano mysite.com/boris/search e rilevo un utente con un controllo vuoto ($ _ GET ['id ']).

Comunque sto creando un'altra richiesta, mysite.com/products/search che porta a products_search.php

ho bisogno della mia RewriteRule originale per adattarsi a qualsiasi utente eccetto la parola 'prodotti'.

Ho provato così tante combinazioni.

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

io non sono molto bravo con regex/mod_rewrite, ma ho qualcosa di simile a quanto sopra dovrebbe funzionare? Ho solo bisogno di un operatore AND come chiaramente & non funziona, ma non riesco a trovarne uno!

Molte grazie in anticipo.

risposta

9

Sono disponibili due opzioni: o utilizzare un RewriteCond per limitare la stringa già trovati:

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

O dal Apache 2, è possibile anche utilizzare un negata look-ahead affermazione:

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

Oltre a questo, puoi anche utilizzare QSA flag invece di aggiungere QUERY_STRING manualmente. E nota che il tuo schema corrente consentirà anche qualcosa come /foobarsearch/, quindi non ha il numero di separazione /.

+0

Grazie a tutti per il vostro aiuto! Perché ho usato il flag [L], ho finito per mettere la linea di prodotti prima. – John

2

Non esattamente "non corrispondenti a una parola" - ma è possibile aggiungere una condizione sulla riscrittura di dire "Se l'URL non corrisponde a questo modello"

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

che è generalmente il modo più comune per fare cose come questa - poiché le condizioni possono anche essere incatenate insieme.

Potete trovare ulteriori informazioni su RewriteCond qui: - http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritecond

1

Se mod_rewrite supporta lookaheads, è possibile utilizzare

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

Secondo to this question on serverfault.com versioni più recenti fanno.

La parte (?!products) indica al motore regex di guardare avanti e fallire se trova "prodotti".

Problemi correlati