URL Rewriting... Mais la nouvelle URL apparait dans la barre d'adresse

Nouveau WRInaute
Bonjour a tous :D

Je suis en train de mettre en place des URL rewriting sur un de mes sites et cela marche plutôt bien. Les pages sont redirigées comme je le souhaite, tout irait bien sauf que.....
L'adresse apparaissant dans la barre d'adresse est... la nouvelle adresse URL (celle sur laquelle on redirectionne)... Certes cela pourrait paraitre logique, mais je pensais que la réécriture d'URL servait justement a cela... Masquer la véritable URL, pour des questions de sécurité et de lisibilité ou simplement de redirection...

Peut-être suis-je dans l'erreur (?) ou y-a-t-il un paramètre pour le spécifier voici les instructions de mon .htaccess

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{QUERY_STRING} ^reference=(.*)&surcat=(.*)&catdesc=(.*)&desc=(.*)
RewriteRule article\.php(.*) /article/%2/%3/%4/%1.html [R=301]

RewriteRule /article/(.*)/(.*)/(.*)/(.*)\.html /article.php?reference=$4 [L]
</IfModule>

la première partie, construisant une adresse .html est (en fait) pour les anciennes adresses encore indexée par les moteurs de recherche, qui étaient en PHP, le RewriteRule la "transforme" au nouvelles normes dossier+html et signale que c'est une redirection permanente.

le deuxième RewriteRule, lui, transforme la nouvelle adresse url avec le bon fichier php d'accès aux articles.

A priori ca se passe bien, lorsque je tape l'ancienne adresse, la transformation se fait bien (en 2 fois) et j'accède bien a la bonne page, sauf que dans la barre d'adresse, je n'ai pas ni l'adresse que j'ai saisi, ni l'adresse HTML, mais l'adresse finale :
article.php?reference=toto !!!

De plus, mais c'est autre chose, ca marche pas terrible lorsque je saisi directement l'adresse dossier+HTML... ca renvoi une erreur 404... (alors que si je saisi l'adresse .PHP précédente, la transformation se fait bien, en 2 temps ?)

Ça fait en fait 2 questions.... Désolé, mais c'est surtout sur l'apparition de la redirection dans la barre d'adresse que je m'interrogeais...

D'avance, Merci beaucoup de votre aide et de vos lumières !
:)

EDIT: Je précise que, bien sur, j'ai déjà parcouru le forum et consulté tous les posts traitant de "URL rewriting et adresse dans la barre" sans trouver la solution.....
Merci de vous intéresser a mon problème et de m'aider :)
 
WRInaute accro
C'est normal que ce soit l'url qui suit la dernière régle qui apparaissent dans la barre. Il me semble qu tu a une règle de trop et que tu prend le problême à l'envers?

Rewrite cond condition sur l'adresse qui identifie la structure d'article
rewrite rule adresse.html vers structure_d'article_mal_écrite.php

N'oublie pas le robots.txt

A plus.
 
Nouveau WRInaute
Merci de ta réponse :)

Mais en fait j'ai deux règles car je veux gérer les pages déjà indexées par Google (entre autres) qui sont de la forme :

article.php?param1&param2&param3&param4
et les passer en ==> /article/param2/param3/param1.html
qui est (sera) la nouvelle forme des liens URL dans mes pages

c'est la première règle :

RewriteCond %{QUERY_STRING} ^reference=(.*)&surcat=(.*)&catdesc=(.*)&desc=(.*)
RewriteRule article\.php(.*) /article/%2/%3/%4/%1.html [R=301]

Ceci essentiellement afin d'éviter les duplicate contents...

Mes nouveaux liens dans les pages sont (seront) du type /article/param2/param3/param1.html
mais mes pages réelles sont toujours des pages PHP

d'où la deuxième règle (qui s'applique éventuellement aussi sur les URL rewritées provenant de google)
RewriteRule /article/(.*)/(.*)/(.*)/(.*)\.html /article.php?reference=$4 [L]

qui transforme les liens de la forme:
/article/param2/param3/param1.html
en /article.php?reference=param1... Qui est ma page physique sur le serveur..

Selon ce que j'ai compris du URL rewriting, le tag [R=301] permet de signaler une redirection permanente des liens article.php sur les nouveaux liens dossier+html, pour moi, ce sont donc ces liens qui doivent apparaitre dans la barre d'adresse, non ?

Et le dernier rewrite avec [L] en fin signale que c'est le dernier rewrite, la page a été trouvée... C'est bon... Mais pourquoi afficher justement cette page ? et pas celle avec le [R=301] ??

Merci de votre aide....

EDIT:
Le but de cette opération est la SEO, évidement, assigner des URL plus explicites et plus SearchEngine Friendly...
1-> Comment réagissent alors Google et les autres moteurs si on donne un lien et que celui récupéré (barre d'adresse) diffèrent ?
Lequel sera indexé ?...
2-> pour des raison de sécurité, comment cacher alors ses paramètres, puisqu'ils apparaitront dans la barre d'adresse... ?

J'avais vu sur developpez.com un schémas laissant sous-entendre que l'on passait au navigateur une URL de format HTML, que cela était réinterprété par le serveur via le .htaccess, vers un fichier PHP, traité, puis la page renvoyée vers le navigateur, mais avec le nom de la page HTML... :roll: .....

Merci de TOUTES vos lumières sur ce sujet....
 
WRInaute passionné
essaye d'ajouter un paramètre et une petite condition pour éviter la redirection après la réécriture :
Code:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{QUERY_STRING} ! &rewrite
RewriteCond %{QUERY_STRING} ^reference=(.*)&surcat=(.*)&catdesc=(.*)&desc=(.*)
RewriteRule article\.php(.*) /article/%2/%3/%4/%1.html [R=301]

RewriteRule /article/(.*)/(.*)/(.*)/(.*)\.html /article.php?reference=$4&rewrite [L]
</IfModule>
 
Nouveau WRInaute
:cry: :cry:
Non, Non, je ne me fait pas comprendre...
ca marche comme je veux.... Au niveau des redirections en tout cas...
Les anciennes pages (Google et autres) sont bien redirectionees (Permanently pour que le moteur le comprenne) vers leur version "Fake" HTML... Puis reconvertie en URL réelle PHP avec les paramètres...
Et les nouveaux liens sont, eux aussi, reconvertis dans la bonne URL a traiter
Jusqu'ici tout va bien...

En fait la seule chose qui me chagrine est que :
si on tape l'URL : /article/accessoires/mode/sacs/toto.html,
l'URL est bien rewritée vers la page PHP correspondante... Normal, pas de soucis, MAIS /article/accessoires/mode/sacs/toto.html n'apparait pas dans la barre d'adresse... c'est article.php?liste_des_parametres qui apparait !!!
Et je veux pas !!! Il FAUT que ce soit la page HTML qui apparaisse comme montré ici...

S'il vous plait quelqu'un.... :cry: :cry:

PS: d'ailleurs de toute façon l'instruction RewriteCond %{QUERY_STRING} ! &rewrite donne une erreur 500... :(
 
WRInaute passionné
je suis quasi sur que c'est ta redirection qui fait ca. As-tu essayé de ne mettre que la réécriture (sans la redirection)?
 
Nouveau WRInaute
forty a dit:
je suis quasi sur que c'est ta redirection qui fait ca. As-tu essayé de ne mettre que la réécriture (sans la redirection)
Euhhh. Que veux-tu dire ?

si j'enlève la deuxième rewriterule, je me retrouve bien avec l'URL HTML dans la barre d'adresse, mais comme la page physique n'existe pas, j'ai une erreur 404.... 8O .... :(

Comme je le dit, les redirect marche comme je le souhaite, c'est juste que c'est l'URL de rewrite avec le PHP et tous les paramètres qui apparait dans la barre d'adresse et non l'URL avec le HTML...

J'ai fait des tests simplissime genre
RewriteRule (.*) /index.php
et effectivement, je re3tourne bien sur index.php, quelque soit la page demandée, mais c'est toujours index.php qui apparait dans la barre d'adresse !!!

J'en arrive a me poser juste une simple question :
Peut-on réellement utiliser le URL rewriting pour masquer ses vrais URL ?
genre que l'utilisateur (et les moteurs) voient toujours "toto-tata-titi.html", alors que la vrai page est "article.php?ref=toto&cat=tata&sort=titi" ?
 
WRInaute passionné
bloodipunk a dit:
si j'enlève la deuxième rewriterule, je me retrouve bien avec l'URL HTML dans la barre d'adresse, mais comme la page physique n'existe pas, j'ai une erreur 404.... 8O .... :(
Je conseille de garder uniquement la réécriture. Ca permettra de voir si elle fonctionne et si elle n'est pas parasitée par la redirection quand elle est présente.
 
Nouveau WRInaute
forty a dit:
Je conseille de garder uniquement la réécriture. Ca permettra de voir si elle fonctionne et si elle n'est pas parasitée par la redirection quand elle est présente.
Merci de tes reponses :D
Mais je ne te suis pas...

Pour être plus clair, je refait un topo plus simple de mon problème :

Ancienne URL (plus du tout utilisée en Lien sur le site, mais indexée par Google et autres) :
article.php?reference=toto&surcat=tata&catdesc=titi&desc=tutu

Nouvelle URL (désormais utilisée partout dans les pages du site) :
/article/tata/titi/tutu/toto.html

URL réelle Physiquement présente sur le site (utilisée pour créer la page demandée) :
article.php?reference=toto

1 - Lorsque je saisie
"article.php?reference=toto&surcat=tata&catdesc=titi&desc=tutu"
dans la barre d'adresse,
la page affichée est bien
"article.php?reference=toto",
la redirection se fait donc bien (en 2 fois, d'abord transformation en HTML puis retransformation en article.php?reference=xx)

2 - Lorsque je saisie
"/article/tata/titi/tutu/toto.html"
dans la barre d'adresse
la page affichée est bien
"article.php?reference=toto",
la redirection se fait donc bien...

MAIS dans tous les cas, c'est
"article.php?reference=toto"
qui apparait dans la barre d'adresse (logique me direz-vous), mais si j'utilise justement le URL rewriting c'est parce que je veux masquer mes URL reelles et voir
"/article/tata/titi/tutu/toto.html"
dans la barre d'adresse...

Je pensais que c'était justement une des utilités de la réécriture d'URL, pouvoir faire de la SEO et reformater les URL vues par les visiteurs et les moteurs et, la, je sais plus.....
 
WRInaute occasionnel
Bonjour,

il me semble aussi que ce que t'as dit Forty est juste :

La redirection parasite le rewriteRule du dessous.

RewriteRule article\.php(.*) /article/%2/%3/%4/%1.html [R=301]

RewriteRule /article/(.*)/(.*)/(.*)/(.*)\.html /article.php?reference=$4 [L]

si tu appelles /article/tata/titi/tutu/toto.html, cela passe dans le rewriteRUle[L] et donc appelle la page article.php
du coup cela repasse par le htaccess et là, comme le htaccess appelle article.php, il le redirige en 301 en passant par la première ligne....

Cela peut surcharger facilement, 2 appels au htaccess pour une page...
Il me semble ...affaire à suivre, dis nous si tu trouves. :wink:
 
Nouveau WRInaute
Merci de ta réponse Djibou-te@m
J'ai donc essayé de virer le
RewriteRule article\.php(.*) /article/%2/%3/%4/%1.html [R=301]
comme tu (et Forty) le conseillait...
Il ne reste donc qu'UNE seule instruction simplissime :
RewriteRule /article/(.*)/(.*)/(.*)/(.*)\.html /article.php?reference=$4 [L]

Mais pareil..... :cry: :cry: :cry: :cry: :cry: :cry:

La redirection se fait bien sur la bonne page : "article.php?reference=toto" mais c'est aussi "article.php?reference=toto" qui apparait dans la barre d'adresse...

Donc, je vais juste poser une question :
Peut-on utiliser l'URL Rewriting pour la SEO, c'est-a dire que l'utilisateur (et les moteurs) ne voit que des URL claires dans les liens des pages du site (ca, ok...) mais aussi dans la barre d'adresse..... ?

En gros est-ce bien comme cela que cela se passe :
1. utilisateur clique sur (ou saisit directement dans la barre d'adresse) /article/tata/titi/tutu/toto.html
2. Serveur interprète via .htaccess et exécute la page article.php?reference=toto
3. la page ainsi construite est renvoyée par le serveur sur le navigateur sous le nom /article/tata/titi/tutu/toto.html

Parce que apparemment ce n'est pas le cas....

Merci de votre aide...

Si c'est possible j'aimerai savoir comment... :D
Si ce n'est pas possible, j'aimerai alors comprendre pourquoi on dit que l'URL Rewriting peut être utilisé pour masquer les URLs (par sécurité ou pour la SEO).... Car la, je ne saisi pas bien le mécanisme :roll:
 
WRInaute passionné
la réécriture marche très bien pour ce que tu souhaites faire : la règle avec [L] est faite pour ca (masquer l'url réelle).

Il y a surement une autre règle dans ton fichier qui parasite la réécriture ou une redirection en php avec la fonction header().
 
Nouveau WRInaute
Merci de ta réponse, je suis heureux d'apprendre que c'est effectivement possible...

Mais alors pourquoi cela ne fonctionne-t-il pas ?
Il n'y a aucun redirectionnement PHP, tout se fait via le rewriterule...

Voici mon .htaccess exact :
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{QUERY_STRING} ^reference=(.*)&surcat=(.*)&catdesc=(.*)&desc=(.*)
RewriteRule article\.php(.*) /art/%2/%3/%4/%1.html [R=301]

RewriteRule /art/(.*)/(.*)/(.*)/(.*)\.html http://www.monsite.com/article.php?reference=$4 [L]
</IfModule>

si je vire http://www.monsite.com/... Rien ne se passe du tout...

tel qu'il est il fonctionnerait pas mal... En tout cas semble faire ce que je souhaite puisqu'en saisissant l'URLs dans la barre d'adresse (ancienne URL avec php+param) cela me mène bien sur la bonne page finale article.php?reference=toto, comme je le souhaite.

Le seul problème est que ce n'est pas l'URL dossier+html qui apparait dans la barre d'adresse.. rien du tout, a priori... :(

1. Lorsque je vire les 2 premieres lignes avec le rewritecond, il ne me reste alors
RewriteRule /art/(.*)/(.*)/(.*)/(.*)\.html http://www.monsite.com/article.php?reference=$4 [L]
si je saisi dossier+HTML dans la barre d'adresse => erreur 404 !!! la redirection ne fonctionne pas ???

Pourquoi cela fonctionne-t-il avec la version de départ :
quand je saisi article.php?reference=toto&surcat=tutu&catdesc=tata&desc=titi, j'arrive bien sur la bonne URL (preuve que les redirections fonctionnent)
Alors que en saisissant art/tutu/tata/titi/toto.html, avec ou sans le rewritecond, cela change tout et ne marche pas du tout, même si le rewritecond n'est pas utilisé (alors que ca marche avec easyPHP avec ancienne URL ou nouvelle dossier+html...) ???

Aaarggghhh... S'il vous plait de l'aide... Je deviens fou... :P 8O :?
 
WRInaute passionné
si tu ne donnes pas ton htaccess exact c'est normal qu'on arrive pas a t'aider.
Si tu mets l'url complète avec "http://" ca fait une redirection. C'est le fonctionnement normal du module rewrite.
Que se passe-t-il si tu enlève "http://www.tonsite.com" ?
 
Nouveau WRInaute
Merci de tes réponses...

J'ai bien essayé de ne pas mettre le http://....,juste avec
RewriteRule /art/(.*)/(.*)/(.*)/(.*)\.html /article.php?reference=$4 [L]
Mais la... Rien ne se passe... Plus de redirectionnement :

Maintenant mon htaccess est comme suit, sans nom de site en dur :
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{QUERY_STRING} ^reference=(.*)&surcat=(.*)&catdesc=(.*)&desc=(.*)
RewriteRule article\.php(.*) /art/%2/%3/%4/%1.html [R=301]

RewriteRule /art/(.*)/(.*)/(.*)/(.*)\.html /article.php?reference=$4 [L]
</IfModule>

Mais du coup, le redirectionnement ne fonctionne plus du tout, genre il; ne semble rien se passer (en tout cas, si je tape article.php?reference=toto&surcat=tata&catdesc=tutu&desc=titi, j'ai la même adresse URL dans la barre d'adresse... c'est ce que je veux, certes, pas de changement, mais la, justement je voudrais voir art/tata/tutu/titi/toto.html... Si c'est possible... Mais bon, admettons que effectivement la redirection se fait... Sans changement de l'URL...)

Mais quand je saisi directement http://www.monsite.com/art/tata/tutu/titi/toto.html dans la barre d'adresse... Selon le .htaccess (assez simple tout de même)... Pareil... Boum... erreur 404... aaaaaaaaaaaaaarrrrrrrrggghhhhh... ... Je m'en sors pas... Plus ca va pire c'est... Ça marche de moins en moins.....

Merci de continuer a m'aider.... On va bien trouver, une simple petite histoire de barre d'adresse....... :cry:
 
WRInaute passionné
essaye de remplacer la réécriture par cette ligne :
Code:
RewriteRule /art/[^/]*/[^/]*/[^/]*/([^/]*)\.html /article.php?reference=$1 [L]

PS : j'ai enlevé les parenthèses car tu n'as besoin de récupérer qu'un seul paramètre
 
Nouveau WRInaute
merci de toutes tes réponses et de l'intérêt que tu portes a résoudre mon problème :D

j'ai donc modifier le .htaccess avec ta ligne :
RewriteRule /art/[^/]*/[^/]*/[^/]*/'[^/]*)\.html /article.php?reference=$1 [L]

=> error 500... j'ai virer la derniere parenthese
RewriteRule /art/[^/]*/[^/]*/[^/]*/'[^/]*\.html /article.php?reference=$1 [L]

Et boum, pareil, erreur 404...

Je m'y perd.....

D'autant que j'ai un .htaccess sous easyphp qui marche tres bien... :( ... Mais pas sur le serveur... mais c'est vrai que je bidouille avec http://www.monsite.com pour easyphp.... Mais ca marche très très bien et ca redirectionne niquel, si ce n'était cet petit PB de barre d'adresse...

J'en deviens fou !!!
JE vais aller me coucher (et oui, ici c'est GMT+7)... En espérant que la nuit porte conseil (ca arrive de trouver des bugs au réveil... si si si).... Ou plutôt qu'en regardant le forum au réveil... tu ais une super solution.......

Merci
 
Nouveau WRInaute
[Résolu] URL Rewriting... Mais la nouvelle URL apparait dans la barre d'adresse

Bonjour... Et merci de tes réponses

Bon j'ai un peu progressé depuis hier en corrigeant quelques fautes de syntaxes...

voici mon nouveau .htaccess
RewriteEngine On
RewriteCond %{QUERY_STRING} ^reference=(.*)&surcat=(.*)&catdesc=(.*)&desc=(.*)
RewriteRule article\.php(.*) /art/%2/%3/%4/%1.html? [R=301[color=#FF0000],L[/color]]

RewriteRule art/(.*)/(.*)/(.*)/(.*)\.html /article.php?reference=$4 [L]

J'ai ajoute le ? et la clause L dans le 1er rewriterule
et j'ai virer le / devant art(.*)/(.*)/(.*)/(.*)\.html....... (Merci Mac :wink: )

Et maintenant ca marcherait parfaitement si.... La page s'affichait correctement...
Le rewrite est OK, je suis bien redirectionné sur
article.php?reference=toto
et je garde bien
art/tutu/tata/titi/toto.html
dans la barre d'adresse :D :D :D

MAIS... La page n'apparait pas comme elle le devrait :
1. elle est très longue a charger
2. les fichiers css et js semblent ne pas être inclus (pas de charte graphique et pas d'anim... Beuark)

Oh lalalala.... Et un nouveau problème...
j'inclus ces fichiers tout a fait normalement dans mon fichier article.php
<link rel="stylesheet" type="text/css" href="cssfile/common.css" media="screen" />
<link rel="stylesheet" type="text/css" href="cssfile/menu.css" media="screen" />
<link rel="stylesheet" type="text/css" href="cssfile/printing.css" media="print" />

<script language="javascript" type="text/javascript" src="scriptjs/common.js"></script>

EDIT
Après multiples recherches, je me suis aperçu que le rewriterule influençait le chemin de recherche des fichiers externes dont le chemin est relatif (sans l'URL en dur)...
en fait le navigateur va chercher les fichiers css dans
art/tutu/tata/titi/cssfile
au lieu de
cssfile/....

J'ai donc rajouté cette simple petite ligne dans mon .htaccess
RewriteRule art/(.*)/(.*)/(.*)/(.*)/(.*) $4/$5 [L]

ET..... CA MARCHE !!!!.....
YES, YES, YES, YES, YES !!!


Je savais bien que la nuit portait conseil... :wink:

Merci beaucoup de ton aide....
Je ferme ce Post comme résolu... :D :D :D
 
WRInaute passionné
tu peux aussi mettre les chemins depuis la racine (en commençant le chemin par /) pour éviter les problèmes de lien relatifs :
Code:
<link rel="stylesheet" type="text/css" href="/cssfile/common.css" media="screen" />
 
Nouveau WRInaute
Effectivement,
Mais le but de l'opération est, pour le moment, de toucher au minimum aux sources PHP...

merci de ta réponse :D

Au fait, on fait comment pour taguer un post [résolu] ?
 
Discussions similaires
Haut