2009-10-10 29 views
10

Estoy tratando de crear una regla utilizada en un archivo .htaccess para que coincida con cualquier cosa excepto una cadena en particular, en este caso: index..htaccess rewrite regex: coincide con cualquier cosa menos "índice"

pensé que debería ser posible para que coincida con esta cadena especial primero y utilizar [L] pero eso no funciona,
y debería ser posible utilizando la siguiente expresión regular, pero causa un error 500.

Quiero coincidir:

  • pagename1
  • pagename2/lo que sea
  • pagename3/234/lo que sea
  • sobre
  • contacto con nosotros
  • (etc)

pero n ot

  • índice/123
  • índice/124/lo que sea

(BTW "índice" es el nombre de un archivo sin extensión, no es mi elección, esto es una cosa de trabajo)

^(?!index)[\w/\-]+ 

que asumen que la aplicación de expresiones regulares de Apache no hacer frente a la regla (?!xxx).

Cualquier ayuda/sugerencia será muy apreciada.

Respuesta

15

Usted puede utilizar RewriteCond s de hacer esto, por ejemplo:

RewriteCond %{REQUEST_URI} !^index 
RewriteRule (.*) index.php?what=$1 

que volverá a escribir cada URL que no comience por el índice . Si desea evitarlo en cualquier lugar de la URL, elimine ^

+0

Solo pude hacer que esto funcionara al usar "! Index" en lugar de "!^Index". (Y sí, "índice" fue el comienzo de la cadena de solicitud, como en la pregunta de jezmck anterior). ¿Alguna idea de por qué este podría ser el caso? – rinogo

+1

Lo resolvió. Incluso si está trabajando en un subdirectorio, el uso de "RewriteCond% {REQUEST_URI}" usa todo el URI de solicitud, por lo que debe incluir la ruta www al directorio actual. En mi caso, esto significa que utilicé: "RewriteCond% {REQUEST_URI}! ^/R/index $" (el archivo .htaccess en el que estoy trabajando está en el directorio 'r'). – rinogo

3

(Por favor leer los comentarios lo dudo y nunca he encontrado problemas, al tiempo que le da a uno mucho más limpio .htaccess archivos, pero:. RewriteCond usando podría preferible a usar RewriteRule con un guión, debido a la forma en rulesets are processed ?)

Sólo tiene que utilizar RewriteRule de la siguiente manera, a no reescritura (el guión), y dejar de reescritura posterior (la [L]) para cualquier cosa que empieza con index/:

# Do not rewrite anything that starts with index/ 
RewriteRule ^index/ - [L]

Después de esto, haga cualquier reescritura que desee.

O tal vez incluso limitar un poco más en primer lugar:

# Do not rewrite files, directories or symbolic links 
RewriteCond %{REQUEST_FILENAME} -f [OR] 
RewriteCond %{REQUEST_FILENAME} -d [OR] 
RewriteCond %{REQUEST_FILENAME} -l 
RewriteRule . - [L]
+0

Ah, bien podría ser la respuesta que estaba buscando, no sabía sobre '-' en .htaccess – jezmck

+1

Conds son más seguros. Si tienes otro índice de concordancia de reglas más adelante, las cosas podrían volverse raras. [L] no es el último pase, simplemente termina el pase actual, hay varios casos en que la solicitud pasa más de una vez a través de las reglas. –

+0

@Vinko, los pases múltiples son buenos para tener en cuenta. ¿Pero cómo un RewriteCond (especialmente un RewriteCond negativo) no estaría sujeto a coincidencias extrañas durante otro pase entonces? – Arjan

1

Apache utilizó tres implementaciones de expresiones regulares distintas. El primero era System V8, desde Apache 1.3 usaban POSIX ERE y desde Apache 2 usan PCRE.Y solo PCRE admite afirmaciones de anticipación. Entonces necesita Apache 2 para usar esa regla.

Pero ahora a su pregunta. Si se utiliza esta regla:

RewriteRule ^index/ - [L] 

cualquier cosa que empieza con /index/ deben ser atrapada por esta regla y no la regla debe aplicarse más.

Pero si eso no funciona, intente lo siguiente:

RewriteRule !^index/ … 

Una vez más, esta regla se aplicará sobre cualquier petición que es ruta URL no comienza con /index/.

Y si desea capturar cualquier cosa de la URL, utilice una condición RewriteCond para probar la ruta de acceso URL completa en sí (%{REQUEST_URI}) o simplemente el partido de uno de sus grupos de patrones:

RewriteCond %{REQUEST_URI} !^/index/ 
RewriteRule (.*) … 
# or 
RewriteCond $1 !^index$ 
RewriteRule ^([^/]+)/(.*) … 
Cuestiones relacionadas