2010-10-10 59 views
11

Tengo un archivo .htaccess que se asigna a .htaccess reescritura rompe rutas relativas

http://www.myserver.com/home/
http://www.myserver.com/index.php?section=home

Esta parte funciona bien. El problema que estoy enfrentando ahora es, todas mis imágenes y CSS residen en un activo subcarpeta con nombre, es decir

http://www.myserver.com/assets/images/
http://www.myserver.com/assets/css/
etc.

Después de redirección del navegador buscará los archivos bajo

http://www.myserver.com/home/assets/images/
la que hace que las cosas se rompen, como este no es un camino válido

he podido añadir otra reescritura que mapea los anteriores a la sub-carpeta correcta, sin embargo, Firebug muestra que las imágenes residen en:

http://www.myserver.com/home/assets/images/

Yo sé que no es realmente un problema, después de todo, mis imágenes y CSS están cargando bien con esta regla. Tengo curiosidad sobre cómo puedo hacer que la ruta sea la ruta real, que es:

http://www.myserver.com/assets/images/

Pegando mi archivo htaccess a continuación. Muchas gracias de antemano.

Options +FollowSymlinks 
RewriteEngine on 
RewriteRule ^([^/]+)/assets/(css|images|js)/(.*)$ /assets/$2/$3 [NC,L] 
RewriteRule ^([^/]+)/$ /index.php?section=$1 [NC,L]

Respuesta

15

El problema es que no se tuvo en cuenta que las URL relativas se resuelven en la base URI que es el URI del documento HTML la referencia se usa. Por lo tanto una ruta relativa URI como assets/images/ en un documento HTML con la ruta URI /home/ se resuelve en /home/assets/images/ en lugar de /assets/images/.

No puede cambiar esto con mod_rewrite ya que la resolución URI la realiza el cliente y no el servidor. Las únicas soluciones son:

  • cambio el URI base usando la BASE element (tenga en cuenta que esto afecta todo relativa URI);
  • utilizando rutas de URI absolutas, p. /assets/images/ en lugar de un pariente assets/images/;
  • ajustando la ruta relativa de URI, por lo que las referencias en /home/ se ajustan a ../assets/images/ para reflejar la profundidad de la ruta.
+0

yo estaba tratando de no tener que ir por el camino de la conversión de todos mis rutas relativas a la absoluta, pero por desgracia, me podría tener que ahora. ¡De nuevo, me olvidé por completo de la etiqueta

BASE
! Eso funcionó como un encanto. Gracias Gumbo, lo aprecio. – irot

+0

@irot: Tenga en cuenta que cambiar el URI base utilizando 'BASE' afecta a * todos * los URI relativos y no solo a aquellos con rutas relativas. – Gumbo

+0

También afecta a las etiquetas de anclaje con hashes. Cualquier etiqueta de anclaje con un atributo href como "#contenido" se resolverá en la URL base y no en la página actual. – VirtuosiMedia

9

Añadir esta línea <BASE href="http://www.yoursitename.com/"> a su página dentro de la etiqueta <head> como los siguientes:

<head> 
     <title>Your site title</title> 
     <BASE href="http://www.yoursitename.com/"> 
.... 
</head>