2010-10-10 13 views
11

Je dispose d'un fichier htaccess qui associe htaccess rewrite casse des chemins relatifs

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

Cette partie fonctionne très bien. La question que je suis confronté est maintenant, toutes mes images et css résident dans un sous-dossier nommé actifs, à savoir

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

Après la redirection du navigateur recherchera les fichiers sous

http://www.myserver.com/home/assets/images/
qui provoque des choses à briser, comme Ce n'est pas un chemin valide.

Je suis en mesure d'ajouter une autre réécriture qui mappe ci-dessus pour le sous-dossier correct, cependant, Firebug montre que les images résident dans:

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

Je sais que ce n'est pas vraiment un problème, après tout, mes images et css se chargent très bien avec cette règle. Je suis juste curieux de savoir comment je pourrais faire le chemin indiqué pour être le chemin réel, qui est:

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

Collage mon fichier htaccess ci-dessous. Merci beaucoup d'avance.

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

Répondre

15

Le problème est que vous n'avez pas considéré que les URL relatives sont résolus sur l'URI de base qui est l'URI du document HTML, la référence est utilisé. Donc chemin d'un URI comme assets/images/ dans un document HTML avec le chemin URI /home/ est résolu à /home/assets/images/ au lieu de /assets/images/.

Vous ne pouvez pas modifier cela avec mod_rewrite car la résolution de l'URI est effectuée par le client et non par le serveur. Les seules solutions sont:

  • changer l'URI de base à l'aide du BASE element (notez que cela affecte tous URI relative);
  • en utilisant des chemins d'URI absolus, par ex. /assets/images/ au lieu d'un parent assets/images/;
  • en ajustant le chemin URI relatif, les références dans /home/ sont ajustées à ../assets/images/ pour refléter la profondeur du chemin.
+0

Je tentais de ne pas avoir à aller le chemin de la conversion de tous mes chemins relatifs à absolu, mais hélas, je pourrait juste devoir maintenant. Là encore, j'ai complètement oublié le tag

BASE
! Cela a fonctionné comme un charme. Merci Gumbo, apprécie-le. – irot

+0

@irot: Notez encore que la modification de l'URI de base à l'aide de BASE affecte tous les URI relatifs et pas seulement ceux ayant des chemins relatifs. – Gumbo

+0

Il affecte également les étiquettes d'ancrage avec des hachages. Toute balise d'ancrage avec un attribut href comme "#content" se résoudra à l'URL de base et non à la page en cours. – VirtuosiMedia

9

Ajoutez cette ligne <BASE href="http://www.yoursitename.com/"> à votre page dans la balise <head> comme suit:

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