Pour comprendre ce que mod_rewrite ne vous devez d'abord comprendre comment un serveur web fonctionne. Un serveur web répond à des requêtes HTTP. Une requête HTTP à son niveau de base ressemble à ceci:
GET /foo/bar.html HTTP/1.1
C'est la simple demande d'un navigateur à un serveur web demandant l' URL /foo/bar.html
. Il est important de souligner qu'il ne demande pas un fichier, il demande juste quelques URL arbitraire. La demande peut également ressembler à ceci:
GET /foo/bar?baz=42 HTTP/1.1
C'est une demande pour une URL, et il a évidemment plus rien à faire avec les fichiers.
Le serveur web est une application qui écoute sur un port, d'accepter les requêtes HTTP provenant de ce port et de renvoyer une réponse. Un serveur web est entièrement libre de répondre à toute demande en aucune façon qu'il lui fit et de la manière que vous l'avez configuré pour répondre. Cette réponse n'est pas un fichier, il est une réponse HTTP qui peut ou peut ne pas avoir quelque chose à voir avec la physique des fichiers sur un disque. Un serveur web n'a pas à être d'Apache, il existe de nombreux autres serveurs web qui sont tout simplement les programmes qui s'exécutent de façon persistante et sont attachés à un port de répondre à des requêtes HTTP. Vous pouvez écrire vous-même. Ce paragraphe a pour objet de divorce vous de la notion que les URLs directement l'égalité des fichiers, ce qui est vraiment important de le comprendre. :)
La configuration par défaut de la plupart des serveurs web est de chercher un fichier qui correspond à l'URL sur le disque dur. Si le document root du serveur est configuré pour, disons, /var/www
, il peut regarder si le fichier /var/www/foo/bar.html
existe et servir de ce si. Si le fichier se termine par ".php" qu'il invoquera le PHP et ensuite retourner le résultat. Tous les cette association est totalement paramétrable; un fichier n'a pas de fin ".php pour le serveur web à exécuter par le biais de l'interprète PHP, et l'URL ne doit pas correspondre à un fichier particulier sur le disque pour que quelque chose arrive.
mod_rewrite est une façon de réécrire l'interne de traitement de la demande. Lorsque le serveur web reçoit une requête de l'URL /foo/bar
, vous pouvez réécrire cette URL dans quelque chose d'autre avant que le serveur web va chercher un fichier sur le disque pour le match. Exemple Simple:
RewriteEngine On
RewriteRule /foo/bar /foo/baz
Cette règle dit que chaque fois qu'une requête correspond à "/foo/bar", de le réécrire "/foo/baz". La demande sera ensuite traitée comme si /foo/baz
avait été demandé. Ceci peut être utilisé pour des effets différents, par exemple:
RewriteRule (.*) $1.html
Cette règle correspond à rien (.*
) et la capture ((..)
), puis réécrit à ajouter ".code html". En d'autres termes, si /foo/bar
a été l'URL demandée, elle sera traitée comme si /foo/bar.html
a été demandé. Voir http://regular-expressions.info pour plus d'informations sur la correspondance d'expressions régulières, de la capture et de remplacement.
Une autre rencontre souvent la règle est ceci:
RewriteRule (.*) index.php?url=$1
Encore une fois, cela correspond à rien et réécrit le fichier index.php à l'origine de la requête URL ajoutés dans l' url
paramètre de requête. I. e., pour toute demande de venir dans, le fichier index.php est exécutée et que ce fichier va avoir accès à l'original de la demande en $_GET['url']
, donc il peut faire ce qu'il veut avec elle.
Ce mod_rewrite ne pas faire
mod_rewrite n'est pas la baguette magique pour faire de votre Url "joli". C'est une erreur courante. Si vous avez ce lien dans votre site web:
<a href="http://stackoverflow.com/my/ugly/link.php?is=not&very=pretty">
il n'y a rien mod_rewrite peut faire pour que jolie. Afin de rendre cette un joli lien, vous devez:
-
Modifier le lien à un joli lien:
<a href="http://stackoverflow.com/my/pretty/link">
Utiliser mod_rewrite sur le serveur pour traiter la requête à l'URL /my/pretty/link
l'aide de l'une des méthodes décrites ci-dessus.
On pourrait utiliser mod_substitute
dans le cadre de transformer sortant HTML des pages et leurs contenus des liens. Si c'est usally plus d'efforts que juste la mise à jour de vos ressources HTML.
Il y a beaucoup mod_rewrite peut faire et très complexe de règles de correspondance, vous pouvez créer, y compris le chaînage de plusieurs réécritures, l'utilisation de proxy demandes à un tout autre service ou à la machine à, de retour spécifique des codes d'état HTTP réponses, en redirigeant les requêtes etc. Il est très puissant et peut être utilisé pour beaucoup de bien si vous comprenez les fondamentaux de la requête HTTP-mécanisme de réaction. Il n'est pas automatiquement vos liens assez.
Voir la documentation officielle pour tous les indicateurs possibles et les options.