2012-06-30 18 views
6

La siguiente es mi estructura de directorios:redirección de un directorio a otro con mod_rewrite

admin\ 
controls\ 
images\ 
media\ 
lib\ 
models\ 
views\ 
index.php 
.htaccess 

La siguiente es mi .htaccess

RewriteEngine On 
RewriteRule /admin/images/(.*) /images/$1 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . /index.php 

quiero todo en/admin/imágenes sean iguales a/imágenes en el directorio raíz. Por ejemplo: http://www.example.com/admin/images/example.png será el mismo que http://www.example.com/images/example.png

problema con mi .htaccess es: Se va a index.php en lugar de reflejar admin/imágenes para imágenes/


Solución

RewriteEngine On 
RewriteRule /admin/images/(.*) /images/$1 [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . /index.php 
+0

¿Pero cuál es el problema? – brezanac

+0

Va a index.php en lugar de reflejar admin/images a images/ – invisal

Respuesta

10

Debe especificar que su regla de reescritura de imagen sea la última en la fila para evitar una nueva escritura. Para eso, simplemente especifique [L] al final de la regla de reescritura de la imagen.

RewriteEngine On 
RewriteRule /admin/images/(.*) /images/$1 [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . /index.php 

EDIT: Aquí es una explicación de por qué se produce el problema (tomado de la sección de comentarios con el fin de proporcionar una aclaración).

Verá que el %{REQUEST_FILENAME} original nunca cambiará sin importar cuántas etapas de reescritura se realicen. Eso significa que cuando se llegue a la segunda regla, esa variable aún apuntará a la imagen existente (que está en /admin/images/) en lugar de la que se está reescribiendo y no existente (/images/). Esa es la razón por la cual la segunda regla siempre se aplicará y por qué las dos líneas condicionales del ejemplo son casi siempre las primeras que se usan durante la reescritura.

+1

Fui estúpido. Intenté [L] una vez (tal vez me olvidé de ahorrar ese tiempo y no funcionó). Muchas gracias. Está trabajando ahora. – invisal

+0

Lo siento, me gustaría entender también. RewriteCond dice que la última regla debe aplicarse solo si el archivo solicitado no es un archivo o un directorio ... ¿no es una imagen un archivo (suponiendo que exista la imagen)? – Zagorax

+0

Tiene razón, pero hay un pequeño truco oculto en estas reglas que es responsable de la confusión :) Usted ve que el '% {REQUEST_FILENAME}' original ** nunca ** cambiará sin importar cuántas etapas de reescritura se realicen. Eso significa que cuando se llegue a la segunda regla, esa variable aún apuntará a la imagen existente (que está en '/ admin/images /') en lugar de a la que está siendo reescrita y no existente ('/ images /'). Esa es la razón por la cual la segunda regla siempre se aplicará y por qué las dos líneas condicionales del ejemplo son casi siempre las primeras que se usan durante la reescritura. – brezanac

4

cambiar la regla de la siguiente manera:

RewriteEngine On 
RewriteRule ^admin/images/(.*) images/$1 

Y ponga su .htaccess en la raíz de su documento, o en la carpeta principal '/ admin'.

+0

Lo intenté y no funcionó. Puse en el documento raíz y carpeta de administrador también. De todos modos, gracias por responder mi pregunta. +1 – invisal

+0

Bastante extraño. Eche un vistazo a http://www.francescoruvolo.it/test/admin/images/. Funciona perfectamente en mi servidor. No tengo ningún index.html en/test/admin/images mientras tenga uno en prueba/imágenes. ¿Tu httpd.conf permite el uso de .htaccess? – Zagorax

+0

El problema es que mi otra RewriteRule anula esta RewriteRule. Agregar [L] simplemente resuelve el problema. – invisal

Cuestiones relacionadas