Skip to content

Kévin Dunglas

Founder of Les-Tilleuls.coop (worker-owned cooperative). Creator of API Platform, FrankenPHP, Mercure.rocks, Vulcain.rocks and of some Symfony components.

Menu
  • Talks
  • Resume
  • Sponsor me
  • Contact
Menu

Des jolies URL en PHP sans mod_rewrite

Posted on July 30, 2006 by Kévin Dunglas

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 :

/var/www/mon-site/ |-- docs |-- images |-- styles `-- web

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 :

Alias /docs /var/www/mon-site/docs Alias /images /var/www/mon-site/images Alias /styles /var/www/mon-site/styles

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

<Directory "/var/www/mon-site/web/">   ForceType application/x-httpd-php   DirectoryIndex index </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.

<?php require ('functions.php'); echo books ($_GET['auteur'], $_GET['annee']); ?>

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 :

<?php require ('functions.php'); // la lignes qui nous interesse list ($auteur, $annee) = explode ('/', $_SERVER['PATH_INFO']); echo books ($auteur, $annee); ?>

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 ?

Related posts:

  1. De jolies URLs pour optimiser votre référencement
  2. Sécuriser tant bien que mal une application Symfony installée dans un sous-répertoire
  3. Avoir de jolies fenêtres ombragées sous Ubuntu
  4. Sécurisez votre blog WordPress !

Leave a ReplyCancel reply

Social

  • Bluesky
  • GitHub
  • LinkedIn
  • Mastodon
  • X
  • YouTube

Links

  • API Platform
  • FrankenPHP
  • Les-Tilleuls.coop
  • Mercure.rocks
  • Vulcain.rocks

Subscribe to this blog

Top Posts & Pages

  • JSON Columns and Doctrine DBAL 3 Upgrade
  • Securely Access Private Git Repositories and Composer Packages in Docker Builds
  • Preventing CORS Preflight Requests Using Content Negotiation
  • FrankenPHP: The Modern Php App Server, written in Go
  • Symfony's New Native Docker Support (Symfony World)
  • Develop Faster With FrankenPHP
  • How to debug Xdebug... or any other weird bug in PHP
  • HTTP compression in PHP (new Symfony AssetMapper feature)
  • PHP and Symfony Apps As Standalone Binaries
  • Generate a Symfony password hash from the command line

Tags

Apache API API Platform Buzz Caddy Docker Doctrine FrankenPHP Go Google GraphQL HTTP/2 Hydra hypermedia Hébergement Javascript JSON-LD Kubernetes La Coopérative des Tilleuls Les-Tilleuls.coop Lille Linux Mac Mercure Mercure.rocks Messagerie Instantanée MySQL performance PHP Punk Rock Python React REST Rock'n'Roll Schema.org Security SEO SEO Symfony Symfony Live Sécurité Ubuntu Web 2.0 webperf XML

Archives

Categories

  • DevOps (84)
    • Ubuntu (68)
  • Go (17)
  • JavaScript (46)
  • Mercure (7)
  • Opinions (91)
  • PHP (170)
    • API Platform (77)
    • FrankenPHP (9)
    • Laravel (1)
    • Symfony (97)
    • Wordpress (6)
  • Python (14)
  • Security (15)
  • SEO (25)
  • Talks (46)
© 2025 Kévin Dunglas | Powered by Minimalist Blog WordPress Theme