Comment faire une redirection 301 ?
Etape 1 : Créer l’action de redirection
L’idée est de passer par une petite action qui se chargera de renvoyer un entête HTTP avec le code 301 et d’effectuer ensuite la redirection vers la page voulue.
Pour ce faire, dans le fichier “MonProjet -> apps -> MonApplication -> modules -> seo -> actions -> actions.class.php” (cf arborescence ci-dessous), nous allons créer l’action “redirection”.
Voici le code à insérer pour effectuer la redirection.
<?php /** * SEO actions. * * @package Nom de l'application * @subpackage Nom du module * @author Votre nom ICI */ class seoActions extends sfActions { /** * Executes index action * * @param sfRequest $request A request object * */ public function executeRedirection(sfWebRequest $request) { $newRouteName = $this->getRequestParameter('newRoute'); $myPatternRouting = $this->getContext()->getRouting(); $parameters = $request->getRequestParameters(); $status = $parameters['status']; unset($parameters['_sf_route']); unset($parameters['newRoute']); unset($parameters['status']); $this->redirect($myPatternRouting->generate($newRouteName, $parameters), $status); } } ?>
Le principe est d’appeler cette action avec une certains nombre de paramètres dont :
- La route vers laquelle on redirige “newRoute”.
- Le status HTTP à renvoyer (dans notre cas “301”.
La fonction se charger ensuite de rediriger le navigateur via la dernière ligne “$this->redirect(…)”.
La méthode est simple et peut être adaptée pour d’autres usages.
Etape 2 : modifier le fichier de routing.
Maintenant que nous avons l’outil, il faut l’utiliser. Nous allons donc modifier le fichier de routing en conséquence.
route1: url: /MaNouvelleUrl.html param: { module: monmodule, action: monaction} route1_redirect: url: /monAncienneUrl.html param: {module: default, action: redirectOldUrl, newRoute: 'route1', status: 301}
Alors la attention il y a une astuce ! en effet quand on developpe une application, on est souvent amener à utiliser les routes à plusieurs endroits dans son code. Si on change simplement la route, on risque d’avoir des conflits. L’astuce est donc de créer une nouvelle route “_redirect” par exemple, qui va répondre sur l’ancienne url. Cette nouvelle route va renvoyer vers notre action “seo/redirection” avec comme paramètre le nom de l’ancienne route.
Ensuite, on modifie notre ancienne route pour qu’elle réponde a la nouvelle url.
On sauvegarde, on déploie, on vide les caches et le tour est joué
Bon c’est pas grand-chose mais ca permet de gérer proprement les redirections 301, 302, etc ….