Le principe de réécriture d’urls permet de “transformer” les urls pour référencer plus simplement des pages clés d’un site internet. Pour cela on utilise le fichier htaccess, un fichier caché situé à la racine du dossier de l’application.

Nous allons voir comment est géré par défaut les urls dans le framework CodeIgniter et comment les modifier pour éviter de perdre le référencement déjà acquis sur un site web.

Rappel:

Un fichier htaccess est un fichier de configuration d’un serveur web Apache. Son contenu s’applique à son répertoire ainsi qu’aux sous-répertoires de celui-ci. Il a pour rôle d’écrire des messages d’erreurs, de modifier les droits d’accès à des fichiers ou des dossiers, et de créer des redirections.

La réécriture d’url est la modification d’une url demandé vers une url voulu (exemple: www.mon-site.com/ma-page.html -> www.mon-site.com/ma-page-voulu.php ). Cette configuration permet au serveur d’interpreter de la même façon ces deux requêtes.

Pré requis:

Il vous faut une application web avec le framework CodeIgniter installé avec un controleur déjà créé.

Mon utilisation:

Mon travail est de migrer un site internet sous le framework CodeIgniter. Seulement, les moteurs de recherches gardent comme référence les urls de l’ancienne version du site internet (exemple: www.mon-site.com/ma-page.html).

Mon controleur ressemble pour l’instant à ça:

class monControleur extends CI_Controller
{
    public function index()
    {

    }

    public function maMethode()
    {
        echo 'Hello World';
    }
}

Si je veux afficher “Hello World”, il faut y accéder avec l’url suivante : www.mon-site.com/index.php/monControleur/maMethode

Malheureusement, je veux garder ma page de départ : www.mon-site.com/ma-page.html

Pour cela, on va modifier en premier le fichier “config.php” dans “application/config”:

$config['uri_protocol']  = 'QUERY_STRING';
$config['allow_get_array'] = TRUE;
$config['enable_query_strings'] = TRUE;
$config['controller_trigger'] = 'c';
$config['function_trigger'] = 'm';
$config['directory_trigger'] = 'd';

Ces modification permettent de changer les types de requêtes des urls de CodeIgniter.

On passe donc d’une url : “www.mon-site.com/index.php/monControleur/maMethode” à une url :

“www.mon-site.com/index.php?c=monControleur&m=maMethode”

Les variables envoyées représentent les éléments suivants:

  • d = dossier du controleur
  • c = nom du controleur
  • m = méthode du controleur

Sur mon exemple précédent, le controleur se trouve dans le dossier par défaut, donc nous n’avons pas besoin de la variable “d”. 

L’avantage de cette modification va nous permettre aussi de faire la réécriture d’urls dynamiques.

On va aussi créer un fichier “.htaccess” à la racine du dossier:

# Démarrage de l'URL Rewriting
#Options +FollowSymLinks
RewriteEngine On
RewriteBase /

# Pages statiques
RewriteRule ^ma-page.html$ index.php?c=monControleur&m=index [L]

Si vos fichiers ne sont pas à la racine du serveur web, adapter la ligne “RewriteBase” avec le nom du dossier racine (exemple: “RewriteBase /CodeIgniterDemo/” ).

On teste notre url: “www.mon-site.com/ma-page.html”, on a bien un résultat “Hello World”, donc Apache interprète bien la requête de la même façon que “www.mon-site.com/index.php?c=monControleur&m=maMethode”.

Réécriture d’urls dynamiques:

On cherche généralement à réécrire les urls dynamiques pour faciliter le réferencement de nos produits et éviter des urls trop techniques. En effet, on préfère avoir “www.mon-site.com/produit/ordinateur-portable-12.html” au lieu de “www.mon-site.com/produit.php?id_produit=12”.

Pour l’exemple, on va créé un controleur “produit.php”:

class Produit extends CI_Controller
{
    public function index()
    {
        // on récupère l'id_produit donné en get
        $id_produit = $this->input->get('id_produit', TRUE);

        // on affiche le résultat
        echo 'Mon produit a un super id: '.$id_produit;

    }
}

On ajoute la ligne dans le fichier htaccess:

RewriteRule ^produit/([A-Za-z0-9-]+)-([0-9]+).html$ index.php?c=produit&m=index&id_produit=$2 [L]
 Voici notre résultat:
On a donc réussi à réécrire notre url pour la rendre plus familière aux utilisateurs et plus pratique pour le réferencement.
Cette astuce n’est pas nécessaire pour un site récemment créé, mais si c’est une refonte, elle devient nécessaire pour garder les atouts du référencement.
De plus, dans cette article nous avons gérer la réécriture d’urls dans un sens seulement. Il vous faudra aussi gérer les urls inverses, c’est à dire d’éviter de pouvoir accéder directement à “www.mon-site.com/produit.php?id_produit=12” ou  “www.mon-site.com/index.php?c=monControleur&m=maMethode”