Redirection suite à changement de CMS + URL rewriting

Nouveau WRInaute
Bonjour à tous !

Novice la matière, je viens solliciter votre aide pour la création de mon fichier .htaccess...

Je vous explique mon cas...

J'ai créé il y a 3 ans un site à l'aide d'un CMS, pour lequel aucune réécriture d'URL n'avait été mise en place. Malgré cela, mon site était bien positionné dans les moteurs de recherche, aussi je ne me suis jamais trop penchée sur la question.
Mon site a donc été allègrement référencé sur la toile pendant 3 ans avec des urls du type
index.php?mod=page&ac=page&id_page=2
index.php?mod=news&ac=commentaires&id=174
/index.php?mod=forum&ac=voir&id=1546
etc etc...

Aucun problème, jusqu'à récemment. Mon petit site prenant de l'ampleur, j'ai dû pour moult raisons changer de CMS. C'est chose faite, et le nouveau présente l'avantage d'utiliser par défaut l'URL rewriting. Je précise que le contenu (articles, forum, pages etc) a été réimporté ou recréé le cas échéant sur le nouveau CMS. Donc toute ancienne page a désormais son équivalent.

Le hic, vous l'aurez compris, est que toutes mes anciennes URL en php dont le web regorge ne sont plus valides. Actuellement, le .htaccess de mon nouveau CMS redirige automatiquement ces adresses qu'il ne peut pas résoudre vers la page d'accueil du site, mais évidemment ça ne me convient pas... J'aimerais que ces ex-adresses renvoient vers les nouvelles pour que :
- D'une part les visiteurs ne se sauvent pas faute d'être tombés directement sur ce qu'ils cherchaient
- D'autre part ne pas perdre le bon positionnement dont bénéficiaient mes anciennes pages, étant donné que les nouvelles ont le même contenu.

La solution réside donc dans une redirection au niveau du .htaccess et c'est là que les ennuis commencent... Les tutos ne manquent pas sur le net pour créer des redirections 301 ou mettre en place des réécritures d'URL. J'ai réussi à faire l'un et l'autre sur des petits fichiers de tests mais je n'arrive pas à combiner le tout avec mon .htaccess existant, je me prends des erreurs 500 à chaque tentative, sans doute à cause de la redirection déjà existante qui renvoie les URLs inconnues vers la page d'accueil.

Je vous colle le contenu de mon .htaccess actuel :
Code:
<IfModule mod_rewrite.c>
  Options +FollowSymLinks
  RewriteEngine On

  # Get rid of index.php
  RewriteCond %{REQUEST_URI} /index\.php
  RewriteRule (.*) index.php?rewrite=2 [L,QSA]

  # Rewrite all directory-looking urls
  RewriteCond %{REQUEST_URI} /$
  RewriteRule (.*) index.php?rewrite=1 [L,QSA]

  # Try to route missing files
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} public\/ [OR]
  RewriteCond %{REQUEST_FILENAME} \.(jpg|gif|png|ico|flv|htm|html|php|css|js)$
  RewriteRule . - [L]
  
  # If the file doesn't exist, rewrite to index
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^(.*)$ index.php?rewrite=1 [L,QSA]

</IfModule>

# sends requests /index.php/path/to/module/ to "index.php"
# AcceptPathInfo On

# @todo This may not be effective in some cases
FileETag Size

Voici quelques exemples de redirections que je souhaite faire :
Renvoi de /index.php?mod=news&ac=commentaires&id=367
vers /articles/367

Renvoi de index.php?mod=forum&ac=voir&id=4823
vers /forums/topic/4823

Renvoi de index.php?mod=page&ac=page&id_page=2
vers /pages/horoscope

Un grand merci à qui pourra m'aider à trouver la solution !

Myriam
 
WRInaute accro
J'ai été dans le même cas il y a peu et j'ai opté pour une solution en PHP + SQL :

-> Tu crées une table qui contient, pour chaque enregistrement, l'ancienne url et la nouvelle url correspondante
-> Tu inclus en amont de tes pages un script PHP qui va vérifier si la page appelée n'est pas une ancienne url, si oui tu rediriges

Et tu vires ta redirection automatique qui est dans le .htaccess.
 
WRInaute accro
genre quand apache a fini de parser le htaccess, le visiteur est sorti du site :D
 
Nouveau WRInaute
Merci de ta réponse rapide !

Pour la création de la table, ça devrait aller. Ca doit représenter au bas mot 6 ou 7000 URLs, mais je vais essayer d'automatiser le truc avec un fichier php avec des boucles pour tous les articles, puis tous les posts du forum etc...

Pour le code PHP, je suis assez novice aussi... J'ai appris "sur le tas", en gros je sais insérer dans une base SQL, récupérer du contenu dedans, l'afficher sur une page, et manipuler les conditions.

En gros, si j'ai bien compris, il faut que :
1/ je repère un fichier de mon CMS qui est appelé systématiquement appelé à chaque page (que je devrais identifier car il contient les balises <html><head>, probablement dans un echo
2/ je colle au tout début de celui-ci un code qui
- vérifie si l'adresse appelée est dans ma table d'adresses à rediriger
- si oui, redirige à l'aide d'un code du genre :
Code:
header("Status: 301 Moved Permanently", false, 301);
header("Location: MA-NOUVELLE-URL-RECUPEREE-DANS-LA-TABLE");
exit();
- si non, je ne fais rien et affiche ma page normalement
C'est bien ça ?

Autre question, comme je l'ai dit il y a un sacré paquet d'URLs à rediriger. Est-ce que le fait d'exécuter ce script à chaque chargement de page ne risque pas de ralentir sensiblement le chargement des pages ?
 
WRInaute accro
Regarde du côté de index.php
myriamrv a dit:
Autre question, comme je l'ai dit il y a un sacré paquet d'URLs à rediriger. Est-ce que le fait d'exécuter ce script à chaque chargement de page ne risque pas de ralentir sensiblement le chargement des pages ?
Oui mais par forcement beaucoup

Ensuite une solution htaccess pur est possible mais c'est très dépendant des tes anciennes et nouvelles url.
Le problème des redirection 301 ancienne/nouvelle page, est en général à traiter avant de migrer.
 
Nouveau WRInaute
zeb a dit:
Regarde du côté de index.php

Oui déjà fait mais ce CMS est hyper complexe (SocialEngine, si tu connais)

Vlà le index.php qui est à la racine à titre indicatif :
<?php
/**
* @package Engine_Core
* @version $Id: index.php 8815 2011-04-07 22:37:36Z john $
* @copyright Copyright (c) 2008 Webligo Developments
* @license http://www.socialengine.net/license/
*/

// Check version
if( version_compare(phpversion(), '5.1.2', '<') ) {
printf('PHP 5.1.2 is required, you have %s', phpversion());
exit(1);
}

// Constants
define('_ENGINE_R_BASE', dirname($_SERVER['SCRIPT_NAME']));
define('_ENGINE_R_FILE', $_SERVER['SCRIPT_NAME']);
define('_ENGINE_R_REL', 'application');
define('_ENGINE_R_TARG', 'index.php');

// Main
include dirname(__FILE__) . DIRECTORY_SEPARATOR
. _ENGINE_R_REL . DIRECTORY_SEPARATOR
. _ENGINE_R_TARG;

Sinon zeb, simple curiosité, tu me conseillais de faire quoi exactement avant de migrer, pour anticiper le problème ?
 
WRInaute accro
Dans un tel cas de changement de CMS j'essaie de conserver les anciennes URL (du coup 0 problème). Mais j'ai pas de paramètres dans mes url sauf si ça tombe sur un formulaire (question de principe).

Comme dans ton cas elles étaient "minables", j'aurais commencé par faire une liste complète pour isoler la structure histoire de voir si des règles simples me permettrait de gérer les urls par paquets
Ensuite j'aurais construit mes nouvelles urls et mis en place une redirection htaccess (traiter le cas en amont permet souvent de créer des nouvelles url propices a des réécritures simples et groupées).

index.php?mod=page&ac=page&id_page=2
index.php?mod=news&ac=commentaires&id=174
index.php?mod=forum&ac=voir&id=1546

pourrait peut être se traiter dans le genre :

http://www.example.com/page/
http://www.example.com/news/
http://www.example.com/forum/

etc ...
le souci est de savoir si une telle structuration est possible.

Maintenant si tel n'est pas le cas chez toi (genre ancienne url comme tu donne et nouvelles déjà fixées) la solution d'une table de transcodage semble la plus simple (pour le volume que tu indique).
Après savoir si il faut la faire en php/SQL ou en php pur (genre structure switch / case) c'est juste une histoire de performance.
 
Nouveau WRInaute
En ce qui concerne la structure des URLs, l'ancien contenu ayant été réimporté, il y a effectivement une cohérence entre les anciennes et les nouvelles, au moins pour les posts du forum et les articles, ce qui représente un bon 99% des pages à rediriger. De ce fait on peut facilement déduire la nouvelle URL d'après l'ancienne, malgré le changement de CMS (tous les posts et articles ont le même id dans la base).

Par exemple, pour l'article n°351, on avait :
index.php?mod=news&ac=commentaires&id=351
on a maintenant /articles/351
Et cette structure est valable pour tous les articles.

Il n'y a pas un moyen plus simple d'automatiser ça dans le .htaccess, en passant en l'occurrence le n°d'article comme une variable ? ? Par exemple, j'ai tenté d'ajouter ça à mon fichier :
Code:
redirectmatch 301 index.php?mod=news&ac=commentaires&id=([0-9]+) http://www.nailissima.fr/articles/$1
mais ça ne fonctionne pas. Pas d'erreur 500, mais l'ancienne adresse me renvoie toujours sur l'index et pas sur l'article correspondant...

Pour le moment j'ai pas mal cherché mais impossible de trouver où coller mon script php... Autant avec mon ancien CMS j'avais aucun problème pour m'y retrouver dans les fichiers, autant SocialEngine est d'une complexité sans nom (pour mon niveau en tout cas)...
 
WRInaute accro
Tu devrais plutôt utiliser le tandem RewriteCond / RewriteRule pour ton forumv "redirectmatch" je connais pas.
Il y a un bon tuto ici dans les dossier sur la réécriture d'url tu devrais t'en inspirer.

Ensuite si tu couvre 99% des urls avec ça il faut regarder a faire des redirections permanentes sur le reste tjs dans le htaccess si le nombre deviens "gérable". A ce stade tu n'aurais pas a intervenir dans tes scripts.
 
Nouveau WRInaute
J'ai bien tenté avec les RewriteRule / RewriteCond, c'est même la 1ère chose que j'ai faite, mais cela ne fonctionne pas. Même en mettant en commentaire tout le reste du fichier .htaccess, (du coup les 3/4 des liens et menus du site ne fonctionnent plus) et bien les anciennes pages continuent de renvoyer vers la page d'accueil et non vers leur homologue. J'arrive pas à comprendre il y a sans doute un truc qui m'échappe mais quoi ?
 
WRInaute accro
Faut voir le code pour ça. les règles de réécritures sont ultra chiantes (pour moi) a gérer mais il y a toujours une réponse a un dysfonctionnement.
 
Nouveau WRInaute
Oui, il y a certainement quelque chose dans le code, ailleurs que dans le .htaccess et qui prévaut sur celui-ci...

J'ai posté dans un forum spécialement dédié à SocialeEgine, mais on me répond juste que c'est pas possible (http://www.socialengineforum.com/in...ges-using-htaccess/page__p__98837&#entry98837) Ca m'plaît tiens...

Je reste convaincue que tout code est modifiable, et heureusement c'est pas parce qu'on sait pas faire que c'est impossible!

J'ai aussi envoyé un mail au support de Socialengine, pas encore de réponse.

En creusant un peu, il semble que les URLs du CMS soient gérées par ZEND, mais je sais même pas comment ça marche et à quoi ça sert. Je continue à fouiller dans les fichiers en attendant, si je trouve quelque chose je vous dirai !

Merci pour l'aide en attendant
 
WRInaute accro
myriamrv a dit:
Oui, il y a certainement quelque chose dans le code, ailleurs que dans le .htaccess et qui prévaut sur celui-ci...
J'en doute car le fichier "htaccess" est géré par un processus apache donc en amont logiquement de toute couche php (ou zend)
Passe moi deux trois url anciennes avec équivalent "nouveau cms" par MP et aussi ton fichier htaccess. Si tu veux je regarderais a quoi ça ressemble et pourrait faire quelques test sur un domaine a moi pour voir.
 
Nouveau WRInaute
C'est sympa de ta part, je t'envoie ça...

Je sais que ça paraît improbable, mais c'est tout de même bizarre qu'en mettant en commentaire la totalité des lignes du htaccess, il y ait toujours ces satanées redirections vers la page d'accueil, et que celui-ci ignore royalement toute règle de rewriting ou de redirection que je lui ajoute...

Enfin je ne fais qu'émettre des suppositions, j'ai bien trouvé le dossier contenant zend sur mon ftp, j'ai édité tous les fichiers, mais rien trouvé qui ressemble à des règles de rewriting à la suite desquelles j'aurais pu ajouter les miennes.
 
Discussions similaires
Haut