Passage d'un site avec bdd

Nouveau WRInaute
Bonjour à tous (collègues webmasteurs)

Après avoir cherché pendant 3 jours en vain, voici un problème que bien des webmasteurs ont du rencontrer:

Ayant créé un site il y a 5 ans, il possède maintenant 850 articles.
J'ai donc décidé de le passer en bdd.
Les url étaient du type monsite.com/articles/toto.php
elles sont maintenant du type monsite.com/articles/toto-1.php

Peut-on par un .htaccess écrire une règle pour que l'ancienne page toto.php renvoie vers toto-1.php .
Je ne veux pas écrire: 850 lignes de redirection comme ceci:
RewriteRule ^toto\.php$ /articles/toto-1.php [L,R=301]

mais plutôt un truc dans le style:
RewriteRule ^(??????????([a-z]+)\.php$ /articles/fiche.php?nomurl=$1&id=$2 [L,R=301]
Que faut-il mettre à la place des ??????????? si c'est possible à moins qu'une autre solution existe.

En espérant que la demande est bien formulée :wink:
 
WRInaute accro
Quoi qu'il arrive, il faudra que tu aies une liste des anciennes URLs (les "toto") avec leur correspondance dans la base (en fait un champ dans la table des articles avec la valeur de "toto" pour chaque).

Ensuite il faut que dans ton php tu cherches le toto dans la base pour trouver l'article. Idéalement, tu dois dans ce cas faire un redirect (301) plutôt que d'afficher directement l'article.

Ensuite tu ajoute une RewriteRule après toutes les autres (qui doivent arrêter la vérification par un flag [L] par exemple) qui renvoie ^(.*).php vers ton script.

Jacques.
 
Nouveau WRInaute
Merci de ta réponse rapide.
Code:
Quoi qu'il arrive, il faudra que tu aies une liste des anciennes URLs (les "toto") avec leur correspondance dans la base (en fait un champ dans la table des articles avec la valeur de "toto" pour chaque).
C'est le cas puisque id=1 correspond à toto id=2 à tata id=3 à titi...
Je récupère ensuite l'id pour créér une fiche toto-1.php, tata-2.php, titi-3.php

Code:
Ensuite il faut que dans ton php tu cherches le toto dans la base pour trouver l'article. Idéalement, tu dois dans ce cas faire un redirect (301) plutôt que d'afficher directement l'article.
Là je ne suis plus :?
 
WRInaute accro
ben...

SELECT id FROM table WHERE ancien_nom=toto

puis redirect vers /toto-id_que_tu_viens_de_recuperer.php

Si tu nous disais plus précisément ce que tu ne comprends pas, ça pourrait aider.

Jacques.
 
Nouveau WRInaute
Re,

Ca y est, je viens de comprendre ta démarche.

Je vais sur l'ancien article toto.php, je recherche dans la base le toto en question et je redirige vers toto-1.php.

Ca veut donc dire qu'il faut que j'ouvre les 850 fichiers et faire la modif pour chacun.
Si je n'ai pas le choix, c'est ce que je ferai.
Code:
Ensuite tu ajoute une RewriteRule après toutes les autres (qui doivent arrêter la vérification par un flag [L] par exemple) qui renvoie ^(.*).php vers ton script.
Il faut aussi que j'écrive 850 lignes?

Merci encore
 
WRInaute accro
Non, ce n'est pas ce que je dis.

Tu renvoies toutes tes pages vers un script (RewriteRule ^(.*).php script_de_redirect.php). Dans ce script, tu récupères le nom de la page demandée (soit en rajoutant un ?page=$1 dans la RewriteRule, soit en utilisant $_SERVER['REQUEST_URI'] par exemple), tu trouves l'id en base, tu fais un redirect.

Jacques.
 
Nouveau WRInaute
Bonjour Jacques,

Je commence à comprendre :oops:
Soit tu es très malin, soit tu es très doué, ou peut-être les deux :wink:

Lorsque j'écris:
RewriteRule ^toto.\php$ /articles/redirection.php [L] ca fonctionne

Si j'écris:
RewriteRule ^(.*).\php$ /articles/redirection.php [L] ça provoque une erreur 500


C'est le (.*) qui me pose problème.
J'ai essayé aussi
RewriteRule !(^.*\.php) /article/redirection.php[L] ça provoque une erreur 404.

je tourne un peu en rond, pourtant, on doit être prêt du but :!:
 
WRInaute accro
Honnêtement je n'utilise jamais mod_rewrite, donc je ne pourrais pas te dire quel est le problème exactement, mais quand tu as l'erreur 500, tu as quoi dans les logs d'erreur Apache? Ils te diront quel est le problème beaucoup plus précisément.

Au fait, c'est "\." (qui signifie "vraiment un point, pas le wildcard") et pas ".\", mais ça ne change pas grand chose.

Et dans ton dernier cas c'est probablement parce que le [L] est collé.

Note que le [L] n'est (probablement) pas indispensable ici, mais il l'est sur les autres RewriteRules avant celle-là.
 
Nouveau WRInaute
Bonjour,

En fait l'erreur 500 vient du fait que lorsque l'on appelle une page par son ancien nom, exemple toto.php, elle est bien renvoyée vers redirection.php mais qui est dans le même répertoire. Le serveur renvoie donc redirection.php vers redirection.php...
On créé une boucle infinie.
Je cherche donc à améliorer cette solution. Si quelqu'un a une :idea: ...
 
WRInaute accro
Encore une fois pas un spécialiste du rewriting, mais là ça ne devrait pas faire une redirection vers ton script, mais plutôt un "alias", et c'est le script qui doit ensuite produire une redirection.

Ce qui est important c'est que la rewriterule qui gère les toto-id.php soit avant celle-ci et qu'elle inclue un [L] pour s'arrêter là, par contre.

Si tu nous donnais:
- les rewriterules exactes que tu utilises
- ton script de redirection
- l'erreur exacte indiquée dans les logs

ça aiderait probablement à débugger tout ça...

Jacques.
 
Nouveau WRInaute
Bonjour,

Ca avance!

J'ai créé une page redirection/redirection.php
avec .htaccess
Code:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /articlessanciens/redirection/redirection.php?page=$1 [L,QSA]

comme ca, toutes les anciennes pages sont redirigées.
Dans la page redirection, je récupère le $1 avec if(isset($_GET['page'])): ca fonctionne!
Je compare avec ce qu'il y a dans la base: WHERE `nomurl` LIKE '$nompage' : ca fonctionne!
Puis j'affiche un lien vers la nouvelle page:
echo 'Voici la nouvelle page:<a href="../articles/'.$nomurl.'-'.$numerofiche.'.php">'.$nomurl.'-'.$numerofiche.'.php</a>';

Est-il possible en php de faire une redirection automatique avec la variable $nomurl sans que le visiteur clique?

Merci
 
Nouveau WRInaute
Bonjour Jacques,

Tout fonctionne et je tiens à te remercier pour ton aide si précieuse!

Voici les codes pour ceux que ca intéresserait:

Le .htaccess pour les anciens articles:
Code:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)\.php$ /articlessancien/redirection/redirection.php?page=$1 [L,QSA]
le fichier redirection/redirection.php
Code:
<?php
     if(isset($_GET['page'])) //On vérifie que la variable $_GET['page'] existe
     {
$page = addslashes($_GET['page']);// On protège l'inclusion dans la base
     }
?>
<?php
        include("../../config-base/connexion.inc.php");
$link = mysql_connect ($host,$user,$pass) or die ("connexion serveur impossible");
mysql_select_db($base) or die ("connexion serveur impossible");

$sql = "SELECT nomurl,id
       FROM nomdelabase
       WHERE `nomurl` LIKE '$page'
	  ";
$result = mysql_query($sql,$link) or die ("pas de résultat");
while ($donnees = mysql_fetch_array($result) )
{
$numerofiche = $donnees['id'];
$nomurl = $donnees['nomurl'];
$url = "http://www.monsite.com/articlesnouveau/$nomurl-$numerofiche.php";
}
mysql_free_result($result);
mysql_close();
?>
<?php  header("Location: $url",TRUE,301);
 ?>

J'espère que le addslashes protège suffisamment l'injection de sql dans la bdd :wink:
PS: pour que le header location fonctionne, il a fallu virer tout les echo de la page.

Bonne journée
 
WRInaute accro
Pas un pro du php, mais il me semble bien qu'il vaut mieux utiliser mysql_real_escape_string.

Et oui, un "header" ne peut fonctionner qu'il si le code n'a rien affiché jusque là.

Jacques.
 
Discussions similaires
C
Réponses
4
Affichages
1K
christele2
C
Haut