Le blog de Nukleo

Supprimer index.php des urls de CodeIgniter

26 janvier 2011 dans Développement | 9 commentaires

Lors d’une installation de base du framework CodeIgniter, les urls des pages se présentent sous la forme de « http://mon-site.com/index.php/controlleur ». Pour plusieurs raisons (urls plus « esthétiques », référencement…) on pourrait souhaiter supprimer le vilain index.php. Voici comment.

HTaccess à la rescousse !

La première étape consiste à créer un fichier .htaccess que l’on placera à la racine du site. Il faut noter que dans le monde unixien les fichiers commençants par un point sont invisibles. Si cela pose un problème il suffira de nommer le fichier htaccess.txt puis de le renommer une fois transféré sur le serveur.

Contenu du fichier .htaccess :

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L,QSA] 

Ces directives indiquent au serveur Apache de rediriger toute requete qui ne cible pas un dossier ou un fichier spécifique vers le fichier index.php et de lui passer en argument tout ce qui suit le nom de domaine. En clair, une url du type « http://mon-site.com/contact » sera redirigée vers « http://mon-site.com/index.php/contact.

Bien sûr on peut intégrer des directives plus élaborées mais ce n’est pas nécessaire si l’on ne cherche qu’à supprimer l’infâme index.php

Modification du fichier de configuration

Il faut ensuite modifier le fichier /system/application/config/config.php en changeant la ligne

$config['index_page'] = "index.php";

en :

$config['index_page'] = "";

Et voila, plus d’index.php !

Mots-clés : , ,

Vous avez aimé l'article ? Partagez-le : 

Commentaires

  1. creadn dit :

    Cela fonctionne chez mon hébergeur, mais pas en local :(
    (J’utilise l’environnement easyphp.)

  2. Erik dit :

    C’est peut être effectivement dû au fait que vous utilisez EasyPHP. Les .htaccess ne fonctionne que sur un serveur Apache et, de mémoire, EasyPHP n’utilise pas ce type de serveur. Essayez peut être avec XAMP ou WAMP qui eux utilisent Apache.

  3. Tom dit :

    N’étant pas au fait de la syntaxe des htaccess, avez vous une idée de l’htaccess que je devrais avoir pour effecter le même genre de manipulation pour 3 applications code igniter utilisant les mêmes fichiers « système » ?

    Je m’explique :
    j’ai 3 « index.php » (blabla1.php,blabla2.php et blabla3.php) chacun étant l’index d’une application (application/blabla1, …). Comment puis-je réécrire l’url pour simplement cacher l’extension .php de mes blablax.php ?

  4. Erik dit :

    Pas simple de répondre à votre question sans plus de précisions. Est ce que chaque application correspond à un nom de domaine ? Quelle est l’arborescence exacte de votre dossier racine ?

  5. Tom dit :

    Effectivement c’est un peu léger en explication, alors en détail ça donne :

    ll de mon dossier contenant code igniter :

    drwxr-xr-x 5 root root 72 mar 24 14:25 application/
    drwxrwxr-x 5 root root 46 mar 18 17:48 assests/
    -rw-r–r– 1 root root 111 mar 29 12:05 index.html
    -rwxr-xr-x 1 root root 6303 mar 24 14:30 millegatedb.php*
    -rwxr-xr-x 1 root root 6302 mar 24 14:28 production.php*
    -rwxr-xr-x 1 root root 6300 mar 24 14:29 research.php*
    drwxr-xr-x 8 root root 122 mar 15 19:54 system/

    ll de mon dossier application :

    drwxr-xr-x 16 root root 4096 mar 24 14:25 millegatedb/
    drwxr-xr-x 16 root root 4096 mar 24 14:24 production/
    drwxr-xr-x 16 root root 4096 mar 24 14:26 research/

    J’aimerai que mon url du type http://monsite.com/research.php/home/accueil

    soit du type http://monsite.com/research/home/accueil

  6. Erik dit :

    Si je comprend bien millegatedb.php, production.php et research.php sont 3 bootstraps différents (ou index.php) pour une même application. Puis derrière il y a le controlleur home et la fonction accueil() (dans le cas de research.php).
    Si c’est bien de cela dont il s’agit, vous essayez de faire du HMVC (séparation d’une application en plusieurs modules ayant chacun leur propres controlleurs, modèles et vues) et je vous conseillerais de regarder du côté de la librairie HMVC disponible ici : https://bitbucket.org/wiredesignz/codeigniter-modular-extensions-hmvc/wiki/Home

  7. Tom dit :

    Bonjour,

    d’après ce que j’ai compris de votre lien, il s’agit d’incorporer un cocktail de composants (modèle, contrôleur et vue) dans une autre application Code Igniter.

    Ce dont je parle est différent, en effet il s’agit de 3 applications distinctes et indépendantes ne partageant que le dossier système (i.e. les librairies, helpers … etc).

    Ce que je souhaiterais faire c’est créer des règles de réécriture pour Apache pour masquer les « .php » de mes différents index.

    Je n’ai pas travaillé en profondeur la question de HMVC mais je pense que cette solution est trop complexe pour le résultat attendu.

  8. Tom dit :

    Finalement je vais laisser les url comme ils sont, à savoir :

    http://monsite.com/research.php/home

    Merci de vous être penché sur mon problème !

  9. Erik dit :

    Je reviens à la charge :)
    Pour votre cas de figure il vous faudra soit avoir un nom de domaine par application, soit un sous-domaine pour chaque application (en supposant que les 3 soient hébergés sur le même hébergement).
    Ensuite sur le gestionnaire de votre hébergeur il faudra rediriger le documentRoot de chaque domaine/sous-domaine vers un repertoire particulier.
    Le dossier system (contenant la librairie de CodeIgniter) sera en dehors de ces 3 repertoires (ou dans l’un d’entre eux uniquement), idéalement en dehors de tout documentRoot.

    par exemple voici ce que pourrait donner votre arborescence (en supposant 3 projets différents, chacun ayant son documentRoot) :
    /root
    -/system (codeigniter)
    -/www
    –/projet1
    —-/application
    —-/index.php
    —-/.htaccess
    –/projet2
    —-/application
    —-/index.php
    —-/.htaccess
    –/projet3
    —-/application
    —-/index.php
    —-/.htaccess

    Les fichiers .htaccess et index.php seront identiques pour les 3.
    dans les fichiers index.php il faudra juste faire pointer $system_path vers le repertoire system à savoir $system_path = ‘../../system’;

    Evidemment il faudra modifier les configuration de base de données en fonction du projet etc…

    Normalement cela devrait fonctionner sans problème (je me sers d’ailleurs de ce type d’arborescence dans quelques projets)