Pour comprendre ce qu'est mod_rewrite, vous devez d'abord comprendre le fonctionnement d'un serveur Web. Un serveur Web répond aux requêtes HTTP . Une requête HTTP à son niveau le plus basique ressemble à ceci:
GET /foo/bar.html HTTP/1.1
Il s'agit de la simple demande d'un navigateur à un serveur Web qui lui demande l' URL /foo/bar.html
. Il est important de souligner qu'il ne demande pas de fichier , il ne demande qu'une URL arbitraire. La demande peut également ressembler à ceci:
GET /foo/bar?baz=42 HTTP/1.1
C'est tout aussi valide une demande d'URL, et cela n'a plus évidemment rien à voir avec les fichiers.
Le serveur Web est une application écoutant sur un port, acceptant les requêtes HTTP arrivant sur ce port et renvoyant une réponse. Un serveur Web est entièrement libre de répondre à toute demande de la manière qu'il juge appropriée / de la manière dont vous l'avez configuré pour répondre. Cette réponse n'est pas un fichier, c'est une réponse HTTP qui peut ou non avoir quelque chose à voir avec des fichiers physiques sur n'importe quel disque. Un serveur Web n'a pas besoin d'être Apache, il existe de nombreux autres serveurs Web qui ne sont que des programmes qui s'exécutent de manière persistante et sont attachés à un port qui répondent aux requêtes HTTP. Vous pouvez en écrire un vous-même. Ce paragraphe visait à vous dissocier de toute notion selon laquelle les URL sont directement égales à des fichiers, ce qui est vraiment important à comprendre. :)
La configuration par défaut de la plupart des serveurs Web consiste à rechercher un fichier qui correspond à l'URL sur le disque dur. Si la racine du document du serveur est définie sur, par exemple /var/www
, il peut rechercher si le fichier /var/www/foo/bar.html
existe et le servir si tel est le cas. Si les extrémités de fichier dans « .php » il appellera l'interpréteur PHP et puis retourner le résultat. Toute cette association est entièrement configurable; un fichier n'a pas besoin de se terminer par ".php" pour que le serveur Web l'exécute via l'interpréteur PHP, et l'URL n'a pas besoin de correspondre à un fichier particulier sur le disque pour que quelque chose se produise.
mod_rewrite est un moyen de réécrire la gestion des requêtes internes. Lorsque le serveur Web reçoit une demande pour l'URL /foo/bar
, vous pouvez réécrire cette URL dans quelque chose d'autre avant que le serveur Web ne recherche un fichier sur le disque correspondant. Exemple simple:
RewriteEngine On
RewriteRule /foo/bar /foo/baz
Cette règle dit chaque fois qu'une requête correspond à "/ foo / bar", réécrivez-la dans "/ foo / baz". La demande sera alors traitée comme si elle /foo/baz
avait été demandée à la place. Cela peut être utilisé pour différents effets, par exemple:
RewriteRule (.*) $1.html
Cette règle correspond à tout ( .*
) et le capture ( (..)
), puis la réécrit pour ajouter ".html". En d'autres termes, s'il /foo/bar
s'agissait de l'URL demandée, elle sera traitée comme si elle /foo/bar.html
avait été demandée. Voir http://regular-expressions.info pour plus d'informations sur la correspondance, la capture et les remplacements d'expressions régulières.
Une autre règle souvent rencontrée est la suivante:
RewriteRule (.*) index.php?url=$1
Ceci, encore une fois, correspond à tout et le réécrit dans le fichier index.php avec l'URL demandée à l'origine ajoutée dans le url
paramètre de requête. C'est-à-dire que pour toutes les demandes entrantes, le fichier index.php est exécuté et ce fichier aura accès à la demande d'origine dans $_GET['url']
, afin qu'il puisse faire tout ce qu'il veut avec.
Vous mettez principalement ces règles de réécriture dans le fichier de configuration de votre serveur Web . Apache vous permet également * de les mettre dans un fichier appelé .htaccess
dans la racine de votre document (c'est-à-dire à côté de vos fichiers .php).
* Si autorisé par le fichier de configuration Apache principal; c'est facultatif, mais souvent activé.
Qu'est - ce que mod_rewrite ne pas faire
mod_rewrite ne rend pas par magie toutes vos URL "jolies". C'est un malentendu courant. Si vous avez ce lien dans votre site Web:
<a href="https://stackoverflow.com/my/ugly/link.php?is=not&very=pretty">
il n'y a rien que mod_rewrite puisse faire pour rendre ça joli. Pour en faire un joli lien, vous devez:
Changez le lien en un joli lien:
<a href="https://stackoverflow.com/my/pretty/link">
Utilisez mod_rewrite sur le serveur pour gérer la requête à l'URL en /my/pretty/link
utilisant l'une des méthodes décrites ci-dessus.
(On pourrait l'utiliser mod_substitute
conjointement pour transformer les pages HTML sortantes et leurs liens contenus. Bien que cela représente généralement plus d'efforts que la simple mise à jour de vos ressources HTML.)
Il y a beaucoup de choses que mod_rewrite peut faire et des règles de correspondance très complexes que vous pouvez créer, y compris le chaînage de plusieurs réécritures, le proxy de requêtes vers un service ou une machine complètement différent, le retour de codes d'état HTTP spécifiques en tant que réponses, la redirection de requêtes, etc. C'est très puissant et peut être utilisé pour très bien si vous comprenez le mécanisme de requête-réponse HTTP fondamental. Cela ne rend pas automatiquement vos liens jolis.
Voir la documentation officielle pour tous les drapeaux et options possibles.