Bonjour,
je galère sur l'url rewriting, ça "fonctionne" déjà un peu, mais voilà mon problème :
Mon arborescence :
www/mon_site/.htaccess
www/mon_site/public/index.php
www/mon_site/app/controller/...
www/mon_site/app/views/...
...
Dans header.php (quand je suis connecté j'ai un bouton "profil") :
<a href="home"><li>Accueil</li></a>
<a href="user/show/' . $user_id . '"><li>Profil</li></a>';
Dans le .htaccess :
RewriteRule ^home?$ public/index.php?p=general.home
RewriteRule ^user/show/([0-9]+)$ public/index.php?p=users.show&id=$1
Quand je navigue dans cet ordre : Accueil, Profil, Accueil
j'aimerai voir dans la barre d'adresse :
mon_site/home
mon_site/user/show/9 (disons que mon ID est 9 pour l'exemple)
mon_site/home
mon_site/home
mon_site/user/show/9
mon_site/user/show/home (Catastrophe !!)
Lorsque tes urls ne commencent pas par un /, c'est quelles sont relatives
si tu es sur une page monsite/A et que tu cliques sur un href='B', alors tu vas en monsite/A/B
Il faut s'aranger pour avoir des urls absolues en gérant par exemple une variable BASE_URL = '/monsite/'
et pour les href = BASE_URL . 'A'
Le jour ou tu passes de 'localhost' au domaine 'monsite', il suffira de changer BASE_URL = '/'
Ah ça y est ça fonctionne ! (phew...)
Le .htaccess est bien dans le dossier mon_site oui, mais ce n'était pas ça le problème.
J'explique un peu si ça peut en aider d'autres.
1) Ma 1ère erreur était d'utiliser des liens relatif dans mes vues
<a href="home">Accueil</a>
alors qu'il fallait utiliser des liens absolus
<a href="/mon_site/home">Accueil</a>
1ère erreur corrigée par Huggy (merci !)
2) Ma 2ème erreur était d'avoir mal compris le fonctionnement des "RewriteRule"
Ce que j'avais compris :
a) on envoie le lien depuis le href
<a href="/mon_site/home">Accueil</a>
b) on récupère ce lien dans la partie gauche du RewriteRule,
et on REDIRIGE (dans la partie droite de RewriteRule) vers le vrai lien
RewriteRule ^/mon_site/A$ /mon_site/public/index.php?p=general.home [L]
Mais pas du tout... :'(
Ce qu'il fallait comprendre
a) on envoie bien le lien absolu depuis le href, ça OK
<a href="/mon_site/home">Accueil</a>
b) mais le RewriteRule ne fais pas une REDIRECTION,
ça REMPLACE le pattern (partie gauche du RewriteRule) trouvé dans le href, par la partie droite du RewriteRule
RewriteRule ^home$ public/index.php?p=general.home [L]
Ici, dans mon lien absolu donné par le href "/mon_site/home",
"home" sera REMPLACÉ par "public/index.php?p=general.home"
pour avoir au final
"/mon_site/public/index.php?p=general.home"
Voilà,
Merci encore Huggy pour ton aide et ta patience.
Salut Huggy,
merci d'essayer de m'aider.
Je viens d'essayer de remplacer dans la vue :
href="home"
par
href="/home"
Ce qui m'a donné dans ma barre d'adresse :
localhost/home
au lieu de
localhost/mon_site/home
ou
localhost/mon_site/public/home
et donc une "page introuvable"
Du coup j'ai essayé de modifier aussi le htaccess, pour rajouter "mon_site" :
J'ai remplacé :
RewriteRule ^home$ public/index.php?p=general.home
par :
RewriteRule ^home$ mon_site/public/index.php?p=general.home
puis par :
RewriteRule ^home$ /mon_site/public/index.php?p=general.home
Mais ça ne fonctionne pas.
Si tu veux publier un jour ton site, je te conseille de créer un virtual host
en définissant monsite.dev -> 127.0.0.1 dans ton fichier hosts
puis en créant un vhost dans apache
comme ça tu auras directement des urls http://monsite.dev/home
Ce n'est qu'un site de test en fait, je ne compte pas le publier.
Pour l'instant j'essaie d'apprendre l'URL Rewriting, et je bloque toujours sur le même problème.
Une fois que j'utilise une URL plus longue dans l'arborescence, je ne peux pas utiliser d'URLs du niveau inférieur.
Je donne un exemple, dans cet ordre :
(en haut c'est l'attribut "href" envoyé par mes "vues",
en bas c'est l'url qui s'affiche dans ma barre d'adresse du navigateur) :
A
mon_site/A
B
mon_site/B
A
mon_site/A
B/C
mon_site/B/C
A
mon_site/B/A (Page Introuvable !)
Effectivement B/A n'existe pas, moi c'est sur A que je voulais aller :'(
Je "traduis" mes autres fichiers pour correspondre à cet exemple simplifié (ça devrai être plus facile pour identifier le problème).
mon fichier index.php est ici :
www/mon_site/public/index.php
ma vue :
<a href="A"> A </a>
<a href="B"> B </a>
<a href="B/C"> C </a>
mon .htaccess :
RewriteRule A public/index.php?p=ma_page_A
RewriteRule B public/index.php?p=ma_page_B
RewriteRule B/C public/index.php?p=ma_page_C
[EDIT]
j'ai pu "contourner" mon problème en remplaçant le "/" dans mon .htaccess par un "."
RewriteRule B\.C public/index.php?p=ma_page_C
Mais bon... ce n'est pas propre du tout... Ça me donne ça dans ma barre d'adresse :
localhost/mon_site/user.show.9
Alors que j'aurai aimé avoir une URL normale, avec des "/" :
localhost/mon_site/user/show/9
(j'imagine que c'est très mauvais pour le référencement)
Je pense qu'avec un flag L (last) ça devrait marcher
RewriteRule A public/index.php?p=ma_page_A
RewriteRule B/C public/index.php?p=ma_page_C [L]
RewriteRule B public/index.php?p=ma_page_C
Comme la règle B matche aussi B/C il faut stopper l'évaluation si B/C est vérifié en mettant [L]
Mince, j'ai essayé de mettre le flag [L] sur l'une, puis sur l'autre, puis sur les 2.
Mais ça ne change rien.
Il ne faut rien faire de spécial pour "activer" les flags ? (je ne pense pas...)
En tous cas merci quand même d'essayer de m'aider ^^
En fait même si les chemins n'ont rien à voir j'ai le même problème.
Par exemple :
.htaccess :
RewriteRule A public/index.php?p=ma_page_A
RewriteRule B public/index.php?p=ma_page_B
RewriteRule Z/C public/index.php?p=ma_page_C
A
mon_site/A
B
mon_site/B
Z/C
mon_site/Z/C
A
mon_site/Z/A
Le problème c'est que le chemin de la dernière URL semble rester en mémoire.
Seule la dernière partie du chemin de l'ancienne URL est écrasé, par la nouvelle URL.
Alors qu'il faudrait que la nouvelle URL reparte de 0.
D'accord, ça me semble très clair.
Du coup j'ai commencé par mettre en absolue la redirection du .htaccess :
href="A"
et
RewriteRule ^A$ /mon_site/public/index.php?p=general.home [L]
J'arrive bien sur la bonne page, dans mon navigateur j'ai :
localhost/mon_site/A
Maintenant j'essaie de régler mon problème, en passant les href en absolue
href="/mon_site/A"
et
RewriteRule ^/mon_site/A$ /mon_site/public/index.php?p=general.home [L]
Mais dans mon navigateur ça me donne une page introuvable :
Not Found
The requested URL /mon_site/A was not found on this server.
Désolé J'ai du mal hein...
Du coup j'ai essayé de mettre
href="localhost/mon_site/A"
RewriteRule ^localhost/mon_site/A$ /mon_site/public/index.php?p=general.home [L]
puis avec le slash devant
href="/localhost/mon_site/A"
RewriteRule ^/localhost/mon_site/A$ /mon_site/public/index.php?p=general.home [L]
et puis je pars dans des délires...
href="http://localhost/mon_site/A"
RewriteRule ^http://localhost/mon_site/A$ /mon_site/public/index.php?p=general.home [L]
rien n'a fonctionné
Si ton htaccess est dans le dossier mon-site alors l'expression testée est amputée de /mon-site
tu dois donc tester uniquement A
RewriteRule ^A$ /mon_site/public/index.php?p=general.home [L]