Des jolies URL en PHP sans mod_rewrite

Certains moteurs de recherche n’indexent pas ou mal les URL de type ma-page.php?variable=valeur&variable2=variable2. En plus d’être mal référencées, ces adresses sont difficiles à retenir et ne sont pas très claires. Autre point négatif, le langage de programmation utilisé (ici PHP) est visible du premier coup d’oeil dans l’extension. La sécurité par l’obscurité c’est mal (c) mais moins un pirate sera renseigné sur le fonctionnement interne de votre application plus il lui sera difficile de la malmener.

Une solution habituelle pour parer à tout ces problèmes est l’utilisation du mod_rewrite d’Apache. Malheureusement l’utilisation de ce module peut être coûteux en performances, et il n’est pas toujours disponible.

Nous allons s’essayer ici à une méthode alternative de fabrication d’URL en utilisant la variable d’environnement $_SERVER[‘PATH_INFO’].

Note : Cette méthode peut ne pas fonctionner si vous avez activé le safe mode ou si PHP tourne en CGI. Tentez alors de mettre AcceptPathInfo à On dans votre configuration d’Apache.

Disposition des répertoires

Pour notre étude de cas, nous prendrons /var/www/mon-site/ comme répertoire racine et /var/www/mon-site/web/ comme DocumentRoot.

Première opération, séparer les scripts PHP des autres composants de votre site web (pages HTML, feuilles de styles, images, documents, …). Cette opération est nécessaire pour ne pas perdre en performances, en effet nous spécifierons à Apache de parser tous les fichiers du répertoires web comme du PHP. L’analyse des fichiers CSS ou SWF à chaque requête par l’interpréteur PHP pourrait augmenter drastique-ment la charge de votre serveur.

On aura par exemple :

Avec docs qui contiendra les documents divers (PDF, TXT, …), images les images, styles les feuilles CSS, XSL, … et enfin web/ nos scripts PHP.

Configurer Apache

D’abord, on change le DocumentRoot dans votre fichier de configuration de vhost (par exemple, /etc/apache2/sites-enabled/000-default).

DocumentRoot /var/www/mon-site/web/

Ensuite on ajoute quelques alias afin que nos répertoires séparés soit accessibles :

Spécifions à Apache de parser tous les fichiers de votre répertoire web/ comme du PHP. On utilisera une règle Directory.

La ligne DirectoryIndex permet que le fichier nommé index soit appelé par défaut à l’ouverture d’un répertoire.

Passons aux choses sérieuses.

Le code PHP

Prenons un script fictif auteur.php qui prend deux paramètres, nom et annee. Par exemple http://mon-site/auteur.php?auteur=Asimov&annee=1958 retournera le(s) livre(s) d’Isaac Asimov publié en 1958.

Transformons ce script pour utiliser notre méthode. D’abord on renomme auteur.php en auteur : mv auteur.php auteur

On apelera le script comme ceci : http://mon-site/auteur/Asimov/1958

Comme vous pouvez le remarquer, le nom des variables disparaît, on ne garde plus que leur contenu séparer par des slashes (/). Tout de suite plus propre non ?

Modifions maintenant notre code source :

Explications : $_SERVER[‘PATH_INFO’] retourne le texte qui suit le nom du fichier dans l’URL, ici /Asimov/1958. Nous séparons ce texte grâce aux délimiteur / entre nos paramètres avec la fonction explode. On assigne respectivement nos deux paramètres aux variables auteur et annee.

Avant : http://mon-site/auteur.php?auteur=Asimov&annee=1958 Après : http://mon-site/auteur/Asimov/1958

C’est tout de même beaucoup plus propre non ?

Leave a Reply