Ancienne URL qui revient après le Rewriting

WRInaute occasionnel
Bonjour à tous, j'ai un petit souci.

Je met en place l'URL Rewriting comme je le fais d'habitude. Mais cette fois-ci, cela ne fonctionne pas correctement sur un site précis.

1 - L'URL d'une page rewritée renvoit bien vers l'ancienne page, mais c'est l'url de l'ancienne page qui revient alors dans la barre d'adresse du navigateur...

2 - Second point, quelle est la meilleure méthode pour redirection 301 d'une page précise ? A la fin de la condition de réécriture, j'ai vu plusieurs solutions sur le forum, et je m'y perd avec les QSA, les L, les R=301, etc...


Code:
Options +FollowSymlinks
Options -Multiviews
RewriteEngine on

RewriteRule nouvelle-page.html  /ancienne-page.php [R=301]


Merci d'avance !
 
WRInaute accro
L'ajout de [R=301] provoque ce souci, l'URL réécrite est bien interprétée mais provoque l'appel et l'affichage de l'URL non réécrite.

Je ne connais pas bien la solution, faut-il dans ce cas doubler chaque règle de réécriture par un redirect match ? Question aux experts
 
WRInaute accro
il suffit juste de ne pas mettre [R], ou [R=301] dans la règle. Elle s'appliquera et gardera l'url de base dans la barre du navigateur
 
WRInaute accro
Oui, mais la question vient - je pense - du besoin de faire une redirection permanente des anciennes URL indexées par les moteurs vers les URL réécrites. A doubler d'un redirect match alors ?
 
WRInaute accro
effectivement, je n'avais pas tilté. Encore une réécriture effectuée à l'envers.
Si l'url a été modifié, ce n'est pas nouvelle -> ancienne qu'il faut réécrire, mais ancienne -> nouvelle
 
WRInaute accro
Euh non en fait , je ne pense pas, j'ai le même type de cas de figure

j'ai des
page.php?bla=1251&bli=1235
indexées
Hop je veux réécrire en
page-1251-1235.html
pas de souci
mais quand je veux mettre en place une redirection des anciennes URLs vers les nouvelles (pour les pages non réécrites indexées par les moteurs par exemple)
ben j'essaie le [R=301]
mais ça provoque l'affichage de l'URL non réécrite dans la barre d'adresse, même si le lien pointe vers l'URL réécrite

Donc je me dis que je dois coupler la réécriture d'url avec un redirectmatch
 
WRInaute occasionnel
Si l'on enlève de [R=301], comment faire comprendre aux moteurs de recherche que l'url a définitivement changée ?
 
WRInaute accro
nickargall a dit:
ben j'essaie le [R=301]
mais ça provoque l'affichage de l'URL non réécrite dans la barre d'adresse, même si le lien pointe vers l'URL réécrite

Donc je me dis que je dois coupler la réécriture d'url avec un redirectmatch

Ca fait bidouille, contact ton hebergeur et demande lui pourquoi [R=301] provoque une coquille.
 
WRInaute passionné
Vous êtes complètement embrouillés sur ce topic :)

Quand on écrit
RewriteRule nouvellepage.html anciennepage.php?param=valeur
Ca permet d'accéder au contenu de l'ancienne page, avec l'adresse de la nouvelle. Ok ?

Quand on écrit
RewriteRule nouvellepage.html anciennepage.php?param=valeur [R]
R=301 ou R (sa valeur par défaut est justement 301) veut dire : ok, mon cher serveur apache, fais une redirection PERMANENTE ET DEFINITIVE de nouvellepage.html vers anciennepage.php?param=valeur.
Ok ?
Donc quand le navigateur demande à Apache nouvellepage.html, Apache dit "euh attends, la page est déplacée définitivement, voilà sa nouvelle adresse : anciennepage.php?param=valeur.
Donc mon navigateur me répète : "mon vieux, la page a été déplacée, je change l'url dans la barre d'adresse pour que tu gardes en tête que maintenant, c'est ANCIENNEPAGE.PHP."
Ok ?

Si je veux rediriger anciennepage.php?param=valeur vers nouvellepage.html alors LA SEULE SOLUTION est de changer le code PHP de anciennepage.php pour lui dire "vérifie si on accède à tes infos depuis la bonne url.. sinon, redirige."
Ok ?
 
WRInaute accro
ok, donc juste un header et ca suffit, dans le genre :

Code:
$url = "$_SERVER[REQUEST_URI]"; 
if($url=='/anciennepage.php?param=valeur') 

{  
header("HTTP/1.1 301 Moved Permanently");  
header("Location: http://".$_SERVER['HTTP_HOST']."/nouvellepage.html "); 
}
Edité par Dj_Apx pour sauver le topic d'un bug :wink:
 
WRInaute accro
ok, donc juste un header et ca suffit, dans le genre :

Code:
$url = "$_SERVER[REQUEST_URI]"; 
if($url=='/anciennepage.php?param=valeur') 

{  
header("HTTP/1.1 301 Moved Permanently");  
header("Location: http://".$_SERVER['HTTP_HOST']."/nouvellepage.html "); 
}
 
WRInaute passionné
C'est ça l'idée.
Par contre "$variable" c'est inutile, on écrit $variable.
Et $tableau[clef] c'est FAUX, on écrit $tableau["clef"]

Donc il ne faut pas
"$_SERVER[REQUEST_URI]";
mais
$_SERVER["REQUEST_URI"];
 
WRInaute accro
Dj_Apx a dit:
C'est ça l'idée.
Par contre "$variable" c'est inutile, on écrit $variable.
Et $tableau[clef] c'est FAUX, on écrit $tableau["clef"]

Donc il ne faut pas
"$_SERVER[REQUEST_URI]";
mais
$_SERVER["REQUEST_URI"];

ouaip, mais ce qui est faux ne marche pas par nature alors que mon code marche. les 3 syntaxes plus bas retourneront correctemnt l'uri et perso jm'en cale de gagner 3 milliemes en parsant correctemnt une variable de tableau. Ca etant pour l'exemple, d'ccord avec toi, il est preferable de parser correctemnt.

Code:
<?php
$url = "$_SERVER[REQUEST_URI]"; 
echo $url.'<br />';

$url = $_SERVER["REQUEST_URI"];
echo $url.'<br />';

$url = $_SERVER[REQUEST_URI];
echo $url.'<br />';

?>
 
WRInaute passionné
Le problème ne se trouve pas au niveau d'un gain de 3 millièmes de temps, il se trouve au niveau des affichages d'erreurs de PHP : si ton niveau d'affichage est faible, PHP va écrire dans la page un truc du style "constante REQUEST_URI inconnue, je fais comme si on avait écrit "REQUEST_URI" entre quotes".

Et si cet affichage se fait avant le header:location, eh bien... pas de redirection :wink:
 
WRInaute accro
En effet, j'avais oublié le header de la page precedente :oops: mais tu sais sur la majorité des hebergeurs le niveau d'erreur est decendu tellement bas que cela passera de toute maniere.
 
Discussions similaires
Haut