• Redirection 301 avec codeigniter

    image de l'aticle Redirection 301 avec codeigniter

    Lorsqu'un client vous commande un nouveau site et que vous constatez que le site existant va devoir subir un sérieux nouveau maillage des urls et que la réécriture des pages va devoir être revue totalement vous vous dites comment vais-je faire cela avec mon Framework préféré?

    Le réponse à cette question est simple et se trouve dans la réécriture du router.

    Tout d'abord la base de données

    create table redirect_link (
    id int(11) auto_increment not null,
    old_url varchar(255) not null,
    new_url varchar(255) not null,
    date_add datetime not null,
    date_upd datetime null,
    primary key (id)
    );

    Ici nous créons une table simple qui prend en compte une ancienne url (old_url) qui va être redirigée vers une nouvelle url (new_url).

    La réécriture du router

    <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

    class MY_Router extends CI_Router {
        
        /**
         * Validates the supplied segments.  Attempts to determine the path to
         * the controller.
         *
         * @access    private
         * @param    array
         * @return    array
         */
        function _validate_request($segments)
        {
            if (count($segments) == 0)
            {
                return $segments;
            }
        
            // Does the requested controller exist in the root folder?
            if (file_exists(APPPATH.'controllers/'.$segments[0].'.php'))
            {
                return $segments;
            }
        
            // Is the controller in a sub-folder?
            if (is_dir(APPPATH.'controllers/'.$segments[0]))
            {
                // Set the directory and remove it from the segment array
                $this->set_directory($segments[0]);
                $segments = array_slice($segments, 1);
        
                if (count($segments) > 0)
                {
                    // Does the requested controller exist in the sub-folder?
                    if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$segments[0].'.php'))
                    {
                        if ( ! empty($this->routes['404_override']))
                        {
                            $x = explode('/', $this->routes['404_override']);
        
                            $this->set_directory('');
                            $this->set_class($x[0]);
                            $this->set_method(isset($x[1]) ? $x[1] : 'index');
        
                            return $x;
                        }
                        else
                        {
                            show_404($this->fetch_directory().$segments[0]);
                        }
                    }
                }
                else
                {
                    // Is the method being specified in the route?
                    if (strpos($this->default_controller, '/') !== FALSE)
                    {
                        $x = explode('/', $this->default_controller);
        
                        $this->set_class($x[0]);
                        $this->set_method($x[1]);
                    }
                    else
                    {
                        $this->set_class($this->default_controller);
                        $this->set_method('index');
                    }
        
                    // Does the default controller exist in the sub-folder?
                    if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$this->default_controller.'.php'))
                    {
                        $this->directory = '';
                        return array();
                    }
        
                }
        
                return $segments;
            }
            
            /*
    * LA MODIFICATION DU ROUTER SE TROUVE ICI
             * On teste si l'url se trouve dans la table redirect_url
             * Et on fait une redirection 301
             */
            $current_url = implode('/', $segments); // On transforme le tableau $segments en string
            
            require_once( BASEPATH .'database/DB'. EXT ); // On charge l'objet DB() de Codeigniter
            $db =& DB();

            // On recherche dans les redirections
            $result = $db->like('old_url', $current_url)->get('redirect_link')->result(); // On fait un select dans la table redirect_link pour voir si l'url s'y trouve
            if (isset($result[0])) // Si trouvé on redirige vers la bonne url en 301 (redirection permanante)
            {
                header("Location: ".$result[0]->new_url, TRUE, 301);
                die();
            }
            /*
    * FIN DE LA MODIFICATION
             */
        
            // If we've gotten this far it means that the URI does not correlate to a valid
            // controller class.  We will now see if there is an override
            if ( ! empty($this->routes['404_override']))
            {
                $x = explode('/', $this->routes['404_override']);
        
                $this->set_class($x[0]);
                $this->set_method(isset($x[1]) ? $x[1] : 'index');
        
                return $x;
            }
        
        
            // Nothing else to do at this point but show a 404
            show_404($segments[0]);
        }    
    }

    Dans le dossier core/ de votre application vous allez créer un fichier MY_Router.php ou MY_ correspond au $config['subclass_prefix'] = 'MY_'; du fichier de configuration de votre application Codeigniter. Cette nouvelle classe hérite du Router de Codeigniter afin de garder les méthode du Router de base accessible. La seule méthode à réécrire est function _validate_request($segments) . Comme vous pouvez le contaster cela est simple, vous n'aurez plus aucune excuse pour ne pas rediriger vos pages correctement.

Laissez un commentaire

* Votre e-mail ne sera jamais utilisé ou donné à un tiers

Recherche

Catégories

Newsletters

Archives