2011-10-15 27 views
5

Tengo algunos problemas para encontrar algo que debería ser simple. Quiero 301 redirigir todo en un directorio a un único archivo en una nueva ubicación.Redirigir 301 de un directorio a un solo archivo

En mi .htaccess, ya he intentado lo siguiente ...

Redirect 301 /myDir/ http://www.mydomain.com/myNewDir/index.html 

y esto ...

Redirect 301 /myDir/ http://www.mydomain.com/myNewDir/ 

y esto ...

Redirect 301 /myDir http://www.mydomain.com/myNewDir 

El problema es que cada uno de ellos simplemente está mapeando cada archivo dentro de /myDir/ y añádalo al final de la URL de destino.

Después de buscar en Google, vi algo que dijo que hacer esto ...

Redirect 301 ^/myDir(.*) http://www.mydomain.com/myNewDir 

Pero eso simplemente hace lo mismo ... es la cartografía de la ubicación del archivo existente al final de la URL.

Era fácil encontrar un montón de ".htaccess redirigir" tutoriales en línea, pero que parecen mostrar solamente los ejemplos obvios como 'asignación de archivos uno a uno' o 'mapeo directorio de uno-a-uno'. Estos tutoriales también parecen descuidar la explicación de varias directivas de archivos relevantes y cómo usarlas correctamente.

Esta cuenta de alojamiento particular es basura y también tiene instaladas extensiones de FrontPage. Mod-rewrite falla (rompe todo el sitio) pero las líneas Redirect 301 funcionan bien. Por lo tanto, hasta que pueda mover este nuevo sitio (que no sea de FrontPage) a una cuenta de hosting más robusta, tendré que seguir con el Redirect 301 one-liner.


¿Cómo puedo utilizar simplemente un Redirect 301 a redirigir todo/myDir/ dentro de la misma fila india situada en /myNewDir/index.html? (Prefiero usar solo /myNewDir/ si es posible). Explique, en detalle, las directivas de archivos utilizadas en su solución.


ACTUALIZACIÓN:

respuesta previamente aceptada no está funcionando.

Ejemplo:

RedirectMatch 301 /myDir1/(.*) http://mydomain.org/newpath/myDir1/index.html 

... está dando una "Demasiados redireccionamientos ocurrió al intentar abrir" error.

Esto se debe a /myDir1/(.*) está haciendo juego en cualquier lugar dentro de la cadena por lo que si la URL de destino contiene /myDir1/ en cualquier lugar, no sólo la raíz, se obtendrá redirigida en un bucle desagradable.

Vea mi propia respuesta publicada para la solución correcta.

Respuesta

12

Encontré la respuesta dentro de uno de mis proyectos anteriores.

Redirect 301 es todo incorrecto para esto. Realmente quería RedirectMatch 301 en su lugar.

RedirectMatch 301 ^/myDir/(.*) http://www.mydomain.com/myNewDir/ 

Explicación (s):

http://httpd.apache.org/docs/1.3/mod/mod_alias.html#redirectmatch

"Esta directiva es equivalente a redirigida, pero hace uso de expresiones regulares estándar, en lugar de una simple coincidencia de prefijo"

http://www.zytrax.com/tech/web/regex.htm

"El^(circunflejo o símbolo de intercalación) fuera corchetes significa mirar sólo a el comienzo de la cadena de destino, por ejemplo,^Win no encontrará de Windows en CADENA1 pero^Moz encontrará a Mozilla ".

y ...

"El. (Punto) significa cualquier carácter (s) en esta posición, por ejemplo, tonelada. Encontrará toneladas, el tono y tonel, pero no insensible porque no tiene el siguiente carácter ".

y ...

El * (asterisco o estrella) coincide con el carácter anterior 0 o más veces, por ejemplo, tre encontrarán árbol (2 veces) y la banda de rodadura (1 vez) y canal (0 veces). *

+0

Gracias. Esto empezaba a volverme loco. Esto funciona para dirigir los contenidos de un directorio completo (cada página dentro de) a una página determinada. – Tom

+0

También vale la pena mencionar que si anteriormente tenía un redireccionamiento 301 que se dirigía al lugar equivocado (al agregar la página a la URL de destino), es posible que necesite borrar el caché de su navegador antes de que recoja la nueva regla de .htaccess. – Russ

1

Prueba esto:

RedirectMatch 301 /myDir/.* http://www.mydomain.com/myNewDir/index.html 

Referencia: http://httpd.apache.org/docs/1.3/mod/mod_alias.html#redirectmatch.

En lo que corchetes. * Se refiere, RedirectMatch utiliza expresiones regulares estándar, lo que significa que puede capturar caracteres coincidentes y utilizarlos en su regla de redirección refferencing como $ 1, $ 2, etc.

En periódica expresiones * significa cualquier cantidad de repeticiones del personaje anterior. . - denota cualquier personaje. Entonces la combinación. * Dice que este patrón coincide con cualquier número de cualquier personaje. Por lo tanto *. * significa que este patrón coincidirá con/myDir y/myDir /, y aún /myDir/test.html. Asi que * . * también se puede usar

+0

Sí, eso funciona. Sé que '. *' Coincide con todos los archivos. ¿Pero puedes expandirte sobre eso? Cualquier variación? ¿Por qué '(. *)' También está funcionando? Un enlace a la documentación en línea sobre esto? ¡Gracias! – Sparky

+0

Ver: http://httpd.apache.org/docs/1.3/mod/mod_alias.html#redirectmatch Acerca de los corchetes.* RedirectMatch usa expresiones regulares estándar, lo que significa que puede capturar caracteres coincidentes y usarlos en su regla de redireccionamiento, refiriéndolos como $ 1, $ 2, etc. – dfsq

+0

En expresiones regulares * significa cualquier número de repeticiones del carácter anterior. '.' - denota cualquier carácter. Entonces la combinación. * Dice que este patrón coincide con cualquier número de cualquier personaje. Por lo tanto *. * significa que este patrón coincidirá con/myDir y/myDir /, y aún /myDir/test.html. Asi que * . * también puede ser usado. – dfsq

Cuestiones relacionadas