2009-03-18 3 views
0

Je veux être en mesure de prendre une URL comme:mod_rewrite: Convertir « Dossiers » en URL dans les paramètres de requête

http://www.example.com/valOne/valTwo/valThree/valFour/valFive 

et le convertir en:

http://www.example.com/index.php?one=valOne&two=valTwo&three=valThree&four=valFour&five=valFive 

Je ne ai vraiment besoin de quelques Les paramètres de requête de mon application permettent à l'expression régulière d'avoir ces cinq codes codés en dur, mais ce serait bien si elle pouvait créer dynamiquement de nouveaux paramètres de requête lorsque des «dossiers» supplémentaires sont ajoutés à l'URL. De plus, tous les cinq dossiers ou QP ne seront pas toujours présents, donc il doit être capable de gérer cela de façon appropriée.

Répondre

6

Voici une règle mod_rewrite qui répond à vos besoins:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^([^/]*)/?([^/]*)/?([^/]*)/?([^/]*)/?([^/]*)/?$ index.php?one=$1&two=$2&three=$3&four=$4&five=$5 

Mais il serait certainement plus facile si vous analysez le chemin URI demandé avec PHP à la place:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule !^index\.php$ index.php 

$_SERVER['REQUEST_URI_PATH'] = preg_replace('/\?.*/', '', $_SERVER['REQUEST_URI']); 
$segments = explode('/', trim($_SERVER['REQUEST_URI_PATH'], '/')); 
var_dump($segments); 
+0

Merci Cela fonctionne très bien! Une question Qu'est-ce que cela fait: RewriteCond% {REQUEST_FILENAME}! -f ?? – macinjosh

+0

Il vérifie si l'URI demandé peut être mappé sur un fichier existant ('-f'). Si c'est le cas, la règle n'est pas appliquée. Dans le cas contraire, chaque URI serait redirigé vers 'index.php' (même' index.php') car il serait également comparé avec '[^ /] *'). Voir http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewritecond – Gumbo

+0

Où devrais-je mettre ce script PHP? Il me semble que si je l'ai mis dans site.com/Dir1/default.php et que l'URL était site.com/Dir1/Dir2/default.php que Dir1/ne serait jamais exécuté (fait cela avec un test rapide). –