2010-11-29 28 views
9

que estaba usando algo como esto ...¿Cuál es la diferencia entre RewriteRule y redirigir 301

RewriteRule here/(.*) http://www.there.com/$1 [R=301,L] 

, pero no pudo conseguir que funcione

Así que he usado este ...

redirect 301 /here http://www.there.com 

y funcionó bien.

¿Alguien puede explicar la diferencia? ¿Necesita los dos?

Además ... ¿cómo excluyo las rutas de la redirección?

Como ... redireccionamiento 301 todo ...

redirect 301 /here http://www.there.com 

pero

/here/stayhere.html 

Gracias

+0

¿Seguro que esto tiene algo que ver con la expresión regular? – Keng

+0

Sí ... idealmachine a continuación dijo que usa expresiones regulares. ¿No es así como todo se iguala? – gravityboy

+0

Y Gumbo dice que usa "expresión regular" – gravityboy

Respuesta

13

RewriteRule is handled by Apache's mod_rewrite, mientras que Redirect is handled by mod_alias. No, no necesitas ambos.

Su RewriteRule (que usa expresiones regulares) no coincidirá con /here (pero coincidirá con las rutas como /here/foo.html) porque está buscando una barra inmediatamente después. Puede hacer que el opcional mediante el uso de un signo de interrogación:

RewriteRule ^here(/?.*) http://www.there.com$1 [R=301,L] 

Ahora que tendrá el mismo efecto que el de redireccionamiento. RewriteCond se puede agregar a excluir ciertos caminos:

RewriteCond $0 !/here/stayhere\.html 

Tenga en cuenta que algunos servidores no tienen mod_rewrite activado de forma predeterminada. Si la adición de RewriteEngine on a su configuración no soluciona el problema y no se puede cambiar el mod_rewrite en, por lo menos mod_alias proporciona la directiva RedirectMatch, que puede ser lo suficientemente bueno:

RedirectMatch 301 ^/here(?!/stayhere\.html)(/?.*) http://www.there.com$1 
+2

redirigir sustituye la coincidencia con el objetivo, dejando las otras partes intactas. RewriteRule en realidad va al objetivo por completo sin que se transfiera nada de la porción buscada. Gran diferencia. – ahnbizcad

1

El RewriteRule probablemente no funcionó debido a que está diciendo un poco diferente cosa que usted era en la redirección. RewriteRule requiere que la dirección incluya la palabra "aquí", seguida de una barra inclinada. La redirección requiere que la dirección tenga la palabra "aquí" precedida de por una barra inclinada. Me gustaría ir con algo como esto:

RewriteRule ^here/?(.*) http://www.there.com/$1 [R=301,L] 

El añadieron ? hace que la barra opcional, y la ^ al principio lo hace de manera que el "aquí" tiene que estar en el inicio de la dirección, no en cualquier lugar dentro de ella.

En cuanto a la exclusión de una dirección en particular, que querría hacer eso precediendo el RewriteRule con esta línea:

RewriteCond %{REQUEST_URI} !(here/stayhere\.html) 

que le dice a ignorar la regla si están pidiendo que se refieren específicamente.

4

Redirect coincide con los prefijos de ruta. La siguiente Redirect partidos cualquier camino que es el prefijo (segmento de trazado wise) se /here y lo anexa a la nueva URI:

Redirect 301 /here http://example.com 

Así que cualquier solicitud que es ruta comienza con /here será redirigido a http://example.com Wile añade los siguientes sufijos camino de /here a http://example.com.

En contraste con eso, RewriteRule funciona con expresiones regulares. En este caso, el siguiente RewriteRule coincidirá con cualquier ruta que contiene here/:

RewriteRule here/(.*) http://example.com/$1 [R=301,L] 

nada después de eso here/ continuación, se anexará a la nueva URL.

Si bien ambas directivas tendrían el mismo efecto al solicitar direcciones URL con las rutas que comienzan con /here, este último también coincidirá con cualquier solicitud que se acaba de ruta contiene here/ como /not/here/foo.

Por otra parte, sólo se puede utilizar condiciones adicionales con mod_rewrite:

RewriteCond $0 !=here/stayhere.html 
RewriteRule ^here(/.*)?$ http://example.com$0 [L,R=301] 

Si usted quiere hacer lo mismo con mod_alias, tendrá que utilizar RedirectMatch con una expresión regular que coincida con cualquier cosa menos /here/stayhere.html.

Cuestiones relacionadas