2010-06-27 6 views

Répondre

7

les parties de la règle de réécriture se décomposent comme suit:

  1. RewriteRule
    Indique cette ligne sera une règle de réécriture, par opposition à une condition de réécriture ou l'un des autres directives du moteur de réécriture

  2. ^(. *)
    $ Matches tous les personnages (.*) de beggining ^ à la fin $ de la demande

  3. /index.php/$1
    la demande sera ré-écrit les données appariées par (.*) dans l'exemple précédent étant substitués à $1.

  4. [L]
    Cela indique mod_rewrite que si le motif à l'étape 2 matchs, appliquer cette règle comme la règle « Last », et ne s'appliquent plus.

Le mod_rewrite documentation est vraiment complet, mais il est vrai beaucoup à patauger dans de décoder un tel exemple simple.

L'effet net est que toutes les demandes seront acheminées par index.php, un modèle vu dans de nombreuses implémentations de contrôleur de vue de modèle pour PHP. index.php peut examiner les segments d'URL demandés (et éventuellement si la requête a été faite via GET ou POST) et utiliser cette information pour invoquer dynamiquement un certain script, sans que l'emplacement de ce script corresponde à la structure de répertoire impliquée par l'URI de la requête.

Par exemple, /users/john/files/index peut invoquer la fonction index('john') dans un fichier appelé user_files.php stocké dans un répertoire de scripts. Sans mod_rewrite, l'URL plus traditionnelle utiliserait probablement une chaîne de requête sans doute moins lisible et invoquerait directement le fichier: /user_files.php?action=index&user=john.

4

Cela provoquera toute demande à être traitée par index.php, qui peut extraire la demande réelle de $ _SERVER [ « REQUEST_URI »]

Ainsi, une demande de/foo/bar sera réécrite comme /index.php/foo/bar

0

(je commente ici parce que je ne dispose pas encore de le représentant de commenter les réponses)

point # 2 dans la réponse de meagar ne semble pas tout à fait droit à moi. Je pourrais être sur une branche ici (j'ai cherché partout pour l'aide avec mes réécritures de .htaccess ...), et je serais heureux pour toute clarification, mais ceci est du Apache 2.2 documentation sur RewriteRule:

Qu'est-ce qui correspond?

Le motif sera initialement comparé à la partie de l'URL après le nom d'hôte et le port, et avant la chaîne de requête. Si vous souhaitez faire correspondre le nom d'hôte, le port ou la chaîne de requête, utilisez un RewriteCond avec les variables% {HTTP_HOST},% {SERVER_PORT} ou% {QUERY_STRING}, respectivement.

Pour moi, cela semble dire que pour une URL de

http: // some.host.com/~user/folder/index.php?param=value

la partie qui sera effectivement adapté est

~ utilisateur/dossier/index.php

Donc, cela ne correspond pas à "tous les caractères (. *) Du début à la fin $ de la requête", sauf si "la requête" ne signifie pas ce que je pensais faire.

+0

Oui, c'est correct. (Et peut-être que cela aurait dû être sa propre question?) –

+0

Apache définit la variable '% {REQUEST_URI}' comme (en utilisant votre exemple) '/ ~ user/folder/index.php' (bien que pour des raisons que je ne vais pas entrer dans , le premier '/' est supprimé pour l'évaluation 'RewriteRule'). Donc, je pense que dire que cela correspond à la totalité de la «demande» est juste. Mon commentaire précédent n'a pas reconnu que votre 'REQUEST_URI' n'est pas synchronisé avec ce qu'Apache définit comme valeur, désolé. –

+0

Désolé, mon erreur. Je vais modifier cela dans le commentaire. Je suppose que ce que j'ai appris, et que je voulais partager avec d'autres débutants, c'est qu'à moins de faire des choses spécifiques dans votre RewriteCond, ce qui arrive réellement à votre RewriteRule n'inclut pas le domaine ni aucun paramètre de requête. – thoni56