Archives par mot-clé : symfony

Faire une redirection 301 en symfony 1

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 ».

L'arborescence d'un projet symfony avec les 2 fichiers que nous allons utiliser.
L’arborescence d’un projet symfony avec les 2 fichiers que nous allons utiliser.

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 ….

Comment se prémunir d’effacer totalement un site … ou la mésaventure d’un clic malheureux !

Voila, il était une fois un développeur qui travaille sous Symfony, Cette informaticien venant de mettre en production une modification a voulu effacer le cache.

Ceci dit sur Symfony, quand on efface le cache via la superbe commande :

./symfony cc

, le site est désactivé pendant un temps plus ou moins long.

Afin d’éviter ce temps d’indisponibilité, on procède de la façon suivante :

  1. on va dans le repertoire du cache, en règle générale :
    /home/user/www/cache
  2. on utilise la commande magique mais à ne pas mettre entre toutes les mains :
    rm -Rf *

Arrive le jour où pas trop bien réveillé, on se trompe de fenêtre et au lieu d’utiliser la formule magique au bon endroit, on le fait dans le répertoire racine du site !

Attention: Ceci est un exemple à ne pas suivre !!! Ne reproduisez pas cette action chez vous !! Sous peine de grave dommages netistiques !!

Bon, on remet le site, on reconfigure le tout, etc ….

Maintenant, réfléchissons à « Comment éviter que cela ne se reproduise ? », et trouvons un solution.

….

On dirait pas mais je réfléchi …

..

DING !! Ca y est j’ai trouvé !!

Le problème est de s’assurer que dans n’importe quel répertoire ou l’on se trouve, on puisse effectuer un effacement du cache en étant dans le bon répertoire !!

La solution un simple alias ou une commande bash pour le faire :

  • En alias, éditer le fichieir .bashrc et ajouter en fin de ficheir la ligne suivante  :
    alias viderCache='rm -Rf /home/user/www/cache/*'

    Ensuite on execute la commande : ‘. .bashrc’ pour recharger les alias.

  • Via un script bash, on edite le fichier ‘viderCache’ et on y met le code suivant :
    #!/bin/bash
    rm -Rf /home/user/www/cache/*

Et hop le tour est joué, on ne risque plus de supprimer le fruit de 4 ans de travail en une demi-seconde d’inattention !!

Cette astuce est déclinable dans bien des cas, et notamment pour les taches répétitives !!

Je vous souhaite que la mésaventure de ce pauvre développeur vous serve.