2009-02-01 6 views
1

I only recently found out about URL rewriting, donc j'ai encore beaucoup à apprendre. Tout en suivant le tutoriel Easy Mod Rewrite, les résultats de l'un de leurs exemples sont vraiment confus.Pourquoi mod_rewrite réécrirait-il deux fois?

RewriteBase/
RewriteRule (.*) index.php?page=$1 [QSA,L] 

réécritures /home comme /index.php?page=index.php&page=home.

Je pensais que les doublons pouvaient avoir été provoqués par quelque chose dans les configs de mon hôte, mais une installation propre de XAMPP fait la même chose. Donc, quelqu'un sait pourquoi cela semble analyser deux fois?

Et, pour moi cela me semble, si cela va faire, ce serait une boucle infinie - pourquoi s'arrête-t-elle à 2 cycles?

Répondre

2

de l'exemple 1 sur this page, qui fait partie du tutoriel lié à votre question:

Supposons que vous utilisez un système CMS qui réécrit les demandes de tout à un seul script index.php.

RewriteRule ^(.*)$ index.php?PAGE=$1 [L,QSA] 

Pourtant, chaque fois que vous exécutez que, quelle que soit le fichier que vous demandez, la variable PAGE contient toujours « index.php ».

Pourquoi? Vous finirez par faire deux réécritures. Premièrement, vous devez demander test.php. Ceci est réécrit à index.php? PAGE = test.php. Une deuxième demande est maintenant faite pour index.php? PAGE = test.php. Cela correspond toujours à votre modèle de réécriture, et à son tour est réécrit à index.php? PAGE = index.php.

Une solution serait d'ajouter un RewriteCond qui vérifie si le fichier est déjà "index.php". Une meilleure solution qui vous permet également de conserver les images et les fichiers CSS dans le même répertoire est d'utiliser un RewriteCond qui vérifie si le fichier existe, en utilisant -f.


le lien est à l'Internet Archive, depuis le site de tutoriel semble être déconnecté

+0

Lien Appelle un site Web qui ne fonctionne plus –

+0

@ChrisJamesChampeau merci, corrigé –

2

De l'Apache Module mod_rewrite documentation:

'dernière | L' (dernier règle)
[...] si le RewriteRule génère une redirection interne [...] cela sera réinjecé t la demande et entraînera la répétition du traitement à partir du premier RewriteRule.

Pour éviter cela, vous pouvez soit utiliser une directive RewriteCond supplémentaire:

RewriteCond %{REQUEST_URI} !^/index\.php$ 
RewriteRule (.*) index.php?page=$1 [QSA,L] 

Ou vous modifier le modèle pour ne pas correspondre index.php et utiliser la variable REQUEST_URI, que ce soit dans la redirection ou plus tard dans PHP ($_SERVER['REQUEST_URI']).

RewriteRule !^index\.php$ index.php?page=%{REQUEST_URI} [QSA,L]