web-dev-qa-db-fra.com

Réécriture d'URL: css, js et images non chargées

J'ai suivi la règle pour .htaccess

Options +FollowSymLinks

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} -f [OR]

RewriteRule ^detail/([0-9]+)/?$ detail.php?id=$1

Il redirige http://localhost/detail/123 URL vers http://localhost/detail.php?id=123. La page redirige avec succès, mais le problème est que CSS, JS, and images ne se charge pas,

CSS, les fichiers js sont situés sous http://localhost/css/ et http://localhost/js/

Une solution consiste à utiliser chemin absolu (ex/CSS, ou/js plutôt que CSS /,/js, mais cela ne semble pas une solution fiable, car nous devons le changer pour tous les fichiers,

Toute autre solution basée sur les règles .htaccess, indépendante de la modification de tous les fichiers PHP et permettant l'utilisation de "chemins relatifs"? 

19
Bhavesh Gangani

Ne soyez pas paresseux et changez vos URI relatifs dans vos ressources. C'est le meilleur.

Vous pouvez faire preuve d’intelligence et utiliser regex pour remplacer tous les fichiers dont vous avez besoin, ce qui correspondrait à quelques doublures et vous avez terminé. Combien de places pourrait-il y avoir à changer? Et vous devriez utiliser un modèle.

Cela devrait fonctionner mais je ne voudrais pas aller de cette façon.

RewriteRule ^detail/(css|js|img)/(.*)?$ /$1/$2 [L,QSA,R=301]

17

une solution consiste à utiliser un chemin absolu (ex/css, ou/js plutôt que simplement css /,/js mais ce n’est pas une solution fiable, car nous devons le changer pour tous les fichiers,

En effet, la base de vos URI relatifs a été modifiée. À l'origine, la base est / quand la page est /detail.php?id=123 et le navigateur remplit correctement les liens relatifs avec la base /. Mais lorsque le navigateur accède à une page telle que /detail/123, la base devient soudainement /detail/ et il tente de l'ajouter devant toutes les URL relatives et aucune d'entre elles ne se charge.

Vous pouvez soit rendre vos liens absolus, soit changer la base de l'URI dans l'en-tête de vos pages (entre les balises <head> </head>):

<base href="/">
20
Jon Lin

J'ai appliqué la réécriture d'URL à un projet dans le noyau php. J'ai rencontré le même problème. CSS, JS et les images ne sont pas chargés. Je l'ai utilisé et cela a fonctionné pour moi. La source

# Allow any files or directories that exist to be displayed directly
RewriteCond ${REQUEST_URI} ^.+$
RewriteCond %{REQUEST_FILENAME} \.(gif|jpe?g|png|js|css|swf|php|ico|txt|pdf|xml)$ [OR]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -l
RewriteRule ^ - [L]
5
Sajal

La réponse d'Anthony est parfaitement valable et il tente en fait de lui transmettre certaines bonnes pratiques.

Cependant, puisque vous ne semblez pas content de cette réponse, voici une solution différente. Insérez simplement cette ligne dans votre .htaccess avant toute commande Rewrite:

RedirectMatch permanent ^/detail/((css|js)/.*)  /$1

Il redirigera toutes les demandes initiales 404 pour /details/css/style.css et /details/js/js.s vers leur emplacement actuel. Ni particulièrement jolie ni élégante, mais ça marche tout simplement.

1
Perleone

ce code fonctionne parfaitement pour moi, ajoutez avant la règle de redirection (RewriteRule ^ detail/([0-9] +) /? $ detail.php? id = $ 1) 

RewriteRule ^(.+)/(admin|css|fonts|ico|include|js|images)/(.*)$ $2/$3 [L]
0
danu