2011-10-14 14 views
9

Estoy tratando de lograr una redirección URL básica para las URL bonitas, y debido a las imágenes, CSS, etc. que también residen en la misma ruta, necesito asegurarme de que si la URL es se accede sin una barra inclinada, se agrega automáticamente.Cómo hacer una redirección mod_rewrite a la URL relativa

Esto funciona bien si pongo la URL absoluta de esta manera:

RewriteRule ^myParentDir/([A-Z0-9_-]+)$ http://www.mydomain.com/myParentDir/$1/ [R,nc,L] 

Pero si puedo cambiar esto a una dirección URL relativa, de modo que no tengo que cambiar cada vez que se mueven las cosas en carpetas , esto simplemente no funciona.

Estos son lo que he intentado todo y no funcionan, o que me vuelven a dirigir a la ruta del directorio interno real del servidor como/public_html/...:

RewriteRule ^myParentDir/([A-Z0-9_-]+)$ ./myParentDir/$1/ [R,nc,L] 

RewriteRule ^myParentDir/([A-Z0-9_-]+)$ myParentDir/$1/ [R,nc,L] 

¿Cuál es la forma correcta de hacer una una dirección URL de modo que si el usuario introduce algo como:

http://www.mydomain.com/somedir/myVirtualParentDir/myVirtualSubdir 

que se le redirecciona a (a través de HTTP 301 o 302):

http://www.mydomain.com/somedir/myVirtualParentDir/myVirtualSubdir/ 

Gracias.

EDIT: Agregando algunos más detalles porque no parece estar claro. Digamos que estoy implementando una galería, y quiero tener URL bonitas usando mod_rewrite. lo tanto, me gustaría tener las URL de la siguiente manera:

http://www.mydomain.com/somedir/galleries/cats 

que muestra miniaturas de los gatos, mientras que:

http://www.mydomain.com/somedir/galleries/cats/persian 

que muestra una imagen de las imágenes en miniatura de todos los gatos, el nombre persa. Así que, en realidad, la estructura de directorios física y reescribir sería la siguiente:

http://www.domain.com/somedir/gallery.php?category=cats&image=persian 

Así que lo que quiero hacer es poner un archivo .htaccess en/somedir que atrapa todas las solicitudes realizadas a/galerías y en función de la subdirectorios virtuales que le sigue, los utilizan como marcadores de posición en la reescritura, con reglas 2 de reescritura:

RewriteRule ^galleries/(A-Z0-9_-]+)/$ ./gallery.php?category=$1 [nc] 
RewriteRule ^galleries/(A-Z0-9_-]+)/+([A-Z0-9_-]+)$ ./gallery.php?category=$1&image=$2 [nc] 

Ahora el problema es que el script de galería, de hecho, necesita un poco de CSS, Javascript y las imágenes, situada en http://www.domain.com/somedir/css, http://www.domain.com/somedir/js y http://www.domain.com/somedir/images respectivamente.

No quiero codificar ninguna URL absoluta, por lo que se hará referencia a CSS, JS e Imágenes usando URL relativas, (./css, ./js, ./images, etc.). Por lo que puedo hacer URL reescritura de la siguiente manera:

RewriteRule ^galleries/[A-Z0-9_-]+/css/(.*)$ ./css/$1 [nc] 

El problema es que desde http://www.domain.com/somedir/galleries/cats es un directorio virtual, lo anterior sólo funciona si el usuario escribe:

http://www.domain.com/somedir/gallaries/cats/ 

Si el usuario omite la barra final mod_dir no lo agregará porque en realidad este directorio no existe.

Si pongo una reescritura de redirección con la URL absoluta funciona:

RewriteRule ^galleries/([A-Z0-9_-]+)$ http://www.mydomain.com/subdir/galleries/$1/ [R,nc,L] 

Pero no quiere tener el prefijo URL codificada porque quiero ser capaz de poner esto en cualquier dominio que quiero en cualquier subdirectorio que quiero, así que he intentado esto:

RewriteRule ^galleries/([A-Z0-9_-]+)$ galleries/$1/ [R,nc,L] 

Pero en lugar redirecciona a:

http://www.mydomain.com/home/myaccount/public_html/subdir/galleries/theRest 

que obviamente no es lo que quiero.

EDIT: aclaración adicional

La solución que estoy buscando es evitar codificar el nombre de dominio o rutas de las carpetas de .htaccess. Estoy buscando una solución donde si empaque el .htaccess con el resto de las secuencias de comandos y los recursos, donde el usuario lo descomprime en su servidor web funciona de la caja. Todo funciona así, aparte de este problema de corte final.

Por lo tanto, cualquier solución que implique la codificación de hardware del directorio principal o la ruta del servidor web en .htaccess de ninguna manera no es lo que estoy buscando.

+0

@DoktorJ ¿La edición en mi post responde a su pregunta? –

+0

Debe elegir su respuesta aceptada, si alguno de estos aquí ayudó. – sjas

Respuesta

0

No estoy seguro de haber entendido por completo su problema.

La redirección de barra inclinada se realiza automáticamente en la mayoría de las instalaciones de Apache debido al módulo mod_dir (99% de posibilidades de que tenga el módulo mod_dir).

Es posible que tenga que añadir:

DirectorySlash On 

Pero es el valor predeterminado.

So. Si accede al foo/bar y la barra no es un archivo en el directorio foo sino un subdirectorio, mod_dir realiza la redirección a foo/bar/.

Lo único que sé que podría romper esto es el Option Multiviews que tal vez esté tratando de encontrar un bar.php, bar.php, bar.a-mime-extension-knwon-by-apache en el directorio. Para que intente agregar:

Option -Multiviews 

Y elimine todas las rewriteRules. Si no obtienes este comportamiento predeterminado de Apache, tal vez tengas que mirar mod-rewrite, pero es como usar una bomba nuclear para matar a una araña. Las bombas nucleares pueden ser bastante delicadas para usar bien.

EDIT: Para el problema de barra diagonal con mod-rewrite puede marcar esta documentation howto, indicando que esto debería funcionar:

RewriteEngine on 
RewriteBase /myParentDir/ 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^(.+[^/])$   $1/ [R] 
+0

Gracias por su respuesta. Sin embargo, recuerde que estos no son directorios reales. Estos no existen físicamente y son solo directorios virtuales para URL bonitas. Entonces, en realidad, la URL: http://www.mydomain.com/somedir/myVirtualParentDir no existe. Sin él, estoy obteniendo los enlaces relativos a las imágenes, etc. inválidos. – jbx

+0

¿Por qué incluiste RewriteBase? Es todo el punto que quiero evitar. No quiero codificar el camino en mi .htaccess. Quiero algo que funcione en cualquier subdirector que lo puse. Esto no es diferente a especificar la ruta completa como http://www.mydomain.com/myParentDir/ en el redireccionamiento, que no quiero. El resto es exactamente igual a mi problema original, donde $ 1/está redirigiendo a la URL física real, no a la virtual.Lo que está sugiriendo simplemente redireccionará al directorio físico myParentDir/theRest en lugar de a/myVirtualDir/theRest. – jbx

+0

@jbx: lea el enlace, esto tiene que colocarse en el directorio de nivel superior y funciona para todos los subdirectorios secundarios. – regilero

4

he aquí una solución directamente de la Apache Documentation (bajo "Arrastrando Problema barra"):

RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^(.+[^/])$   $1/ [R] 

Aquí es a solution que pone a prueba la REQUEST_URI para una barra al final, a continuación, lo agrega:

RewriteCond %{REQUEST_URI} !(/$|\.) 
RewriteRule (.+) http://www.example.com/$1/ [R=301,L] 

Aquí es another solution que le permite eximir a determinados patrones REQUEST_URI:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} !example.php 
RewriteCond %{REQUEST_URI} !(.*)/$ 
RewriteRule ^(.*)$ http://domain.com/$1/ [L,R=301] 

Esperamos que estas ayuda. :)

1

Este fuerza de trabajo:

RewriteRule ^myParentDir/[A-Z0-9_-]+$ %{REQUEST_URI}/ [NS,L,R=301] 

Sin embargo, no estoy seguro de por qué cree que necesita en absoluto. Simplemente haga su regla de reescritura archivo CSS/JS/imagen se vea algo como esto:

RewriteRule ^galleries/([A-Za-z0-9_-]+/)*(css|js|images)/(.*)$ ./$2/$3 

y todo debería funcionar bien con independencia de que el navegador solicita /somedir/galleries/css/whatever.css o /somedir/galleries/cats/css/whatever.css o incluso /somedir/galleries/cats/persian/calico/css/whatever.css.

Ps. Un problema con esta regla es que le impide tener nombres de galerías "css", "js" o "imágenes". Es posible que desee corregir eso nombrando esos directorios virtuales algo así como ".css", ".js" y ".images", o utilizando algún otro esquema de nombres que no entre en conflicto con los nombres válidos de las galerías.

2

Esta regla debería agregar una barra inclinada a cualquier URL que no sea un archivo/directorio real (que creo que es lo que necesita, ya que Apache generalmente redirige automáticamente los directorios existentes).

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.+[^/])$ $1/ [L,R=301] 

Editar:

Con el fin de evitar que Apache desde anexar la ruta relativa a la raíz del documento, usted tiene que utilizar RewriteBase. Así, por ejemplo, en la carpeta destinada a ser la raíz de la aplicación, se agrega lo siguiente, que anula la ruta física:

RewriteBase/
+0

Parece que el truco para usar RewriteBase es tener una barra inclinada anterior * y *; por ejemplo, "/ foo /" en lugar de "/ foo" o "foo /". RewriteBase todavía era un poco quisquilloso para mí, pero finalmente funcionó. ¡Gracias! –

Cuestiones relacionadas