2010-10-21 11 views
9

Por favor ayuda, me estoy volviendo loco!Cómo NO emparejar una palabra en mod_rewrite

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

Éste es mi código actual. A veces las personas visitarán mysite.com/search, otras veces visitarán mysite.com/boris/search y detectaré a un usuario con un cheque vacío ($ _ GET ['id']).

Sin embargo estoy creando una nueva búsqueda, mysite.com/products/search que conduce a products_search.php

necesito mi RewriteRule originales para adaptarse a cualquier usuario, excepto la palabra 'productos'.

He intentado tantas combinaciones.

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

No soy muy bueno con regex/mod_rewrite pero algo como lo anterior debería funcionar? Solo necesito un operador AND ya que claramente & no funciona, ¡pero no puedo encontrar uno!

Muchas gracias de antemano.

Respuesta

9

Usted tiene dos opciones: o bien utilizar un RewriteCond para restringir la cadena ya emparejado:

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

O desde Apache 2, también se puede utilizar un negado la afirmación de preanálisis:

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

Además de eso, también puede usar el QSA flag en lugar de agregar QUERY_STRING manualmente. Y tenga en cuenta que su patrón actual también permitirá algo como /foobarsearch/, por lo que no tiene la separación /.

+0

¡Gracias a todos por su ayuda! Como utilicé la bandera [L], terminé poniendo la línea de productos primero. – John

2

No exactamente "que no coincida con una palabra" - pero se puede agregar una condición en la reescritura de decir "Si la URL no coincide con este patrón"

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

que generalmente es la forma más común de hacer cosas como esta, ya que las condiciones también se pueden encadenar juntas.

Puede encontrar más información sobre RewriteCond aquí: - http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritecond

1

Si mod_rewrite es compatible con los símbolos de anticipación, puede utilizar

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

Según to this question on serverfault.com versiones más recientes hacen.

La parte (?!products) le dice al motor de expresiones regulares que mire hacia adelante y falle si encuentra "productos".