Bonjour,

je galère sur l'url rewriting, ça "fonctionne" déjà un peu, mais voilà mon problème :

Ce que je fais

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

Ce que je veux

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

Ce que j'obtiens

mon_site/home
mon_site/user/show/9
mon_site/user/show/home (Catastrophe !!)

14 réponses


Huggy
Réponse acceptée

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 = '/'

SLK
Auteur
Réponse acceptée

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.

Bonjour SLK,
comme ton 'home' est à la racine, as-tu essayé '/home' dans le href ?

SLK
Auteur

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

SLK
Auteur

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 :'(

SLK
Auteur

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]

SLK
Auteur

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 ^^

SLK
Auteur

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.

SLK
Auteur

désolé je fais un petit up,
je n'y arrive toujours pas :'(

SLK
Auteur

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...

SLK
Auteur

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]