2008-10-07 21 views
2

Quelqu'un peut-il expliquer ce que fait cette règle mod_rewrite?Expliquer cette règle mod_rewrite

Je suis en train de commenter le dossier, mais le code semble indiquer le contraire de ce que je pense qu'il fait

# Enable rewriting of URLs 
RewriteEngine on 


# Allow specified file types to be accessed 
# Thing to test = URL 
# Condition = not starting with 
RewriteCond $1 !^(index\.php|images|css|js|robots\.txt) 


# RewriteRule will only be performed if the preceeding RewriteCond is fulfilled 
# Remove index.php from all URLs  
# Pattern = anything (0 or more of any character) 
# Substitution = index.php + the rest of the URL  
RewriteRule ^(.*)$ /index.php/$1 [L] 

Répondre

3
^ = begin of line 
(= begin group 
.* = any character, any number of times 
) = end group 

Le 1 $ dans la deuxième partie est remplacé par le groupe dans la première partie.

Est-ce une règle Symfony? L'idée est de passer toute la chaîne de requête à index.php (le contrôleur frontal) en tant que paramètre, afin que le contrôleur frontal puisse l'analyser et l'acheminer.

+0

En fait, c'est de CodeIgniter. Alors, le contrôleur frontal fait-il la réécriture? – meleyal

+0

Il n'y a pas de contrôleur frontal mais il y a un default_controller. Voir la documentation de CI. http://codeigniter.com/user_guide/general/routing.html – gradbot

+0

Non, mod_rewrite fait la réécriture. Je posterai une nouvelle réponse pour expliquer plus, je ne peux pas l'intégrer dans ces 300 caractères. – Roel

2

Si l'URL ne démarre pas avec index.php ou des images ou js ou css ou robots.txt, la chaîne "/index.php/" est préfixée.

Comme index.php est probablement une application php exécutable, index.php peut alors lire le reste de l'URL à partir de son environnement cgi. (Il est stocké dans $ {} PATH_INFO)

5

Le navigateur envoie une requête au serveur (Apache, puisque vous utilisez mod_rewrite):

GET profil/modifier

Apache accepte cette demande et voit dans ses fichiers de configuration que vous avez configuré pour passer toutes les demandes via mod_rewrite. Donc, il envoie la chaîne 'profile/edit' à mod_rewrite. Mod_rewrite applique ensuite les règles que vous lui avez spécifiées, ce qui transforme ensuite la requête (comme je l'ai expliqué dans mon post précédent) en 'index.php/profile/edit'. Une fois mod_rewrite terminé, Apache continue de traiter la requête et voit 'oh, ce type demande le fichier index.php'. Il appelle donc l'interpréteur php qui analyse ensuite et exécute index.php - et obtient '/ profile/edit' comme arguments. Le code php (CI dans votre cas) analyse ces arguments et sait comment appeler le bon module dans votre application. Donc, fondamentalement, c'est un moyen de toujours appeler index.php, même si l'URL ne spécifie pas index.php. De cette façon, index.php fonctionne comme contrôleur frontal: il achemine toutes les requêtes au bon endroit dans votre application.

+0

Bonne explication, merci. Mais alors, comment 'index.php' est-il supprimé de mes URL? Mes URL ressemblent à domain.com/profile/edit – meleyal

+0

Que voulez-vous dire 'supprimé'? CI a probablement un moyen de spécifier si vous voulez ou non inclure 'index.php' dans les URL que vous émettez (je suppose que dans CI, vous devez utiliser des appels de fonction pour sortir les url, c'est comme ça que ça fonctionne dans Symfony - expérience avec cela). – Roel

+0

Ainsi, cette fonction peut déterminer si le paramètre pour inclure index.php dans vos URL est activé ou désactivé. Les clients (navigateurs) ne voient que l'URL sans index.php. Dans une requête entrante, mod_rewrite réécrit ajoute index.php, et le code php n'émet pas d'URL avec index.php. – Roel