2009-01-27 6 views
0

Quelles seraient les règles de .htaccess valides pour faire quelque chose comme ça.htaccess à toute longueur

/mypage/ --> /index.php?page=mypage 
/mypage/param1/value1/ -->index.php?page=mypage&params=param1/value1 

Avec un nombre potentiellement illimité de paramètres?

Merci.

+0

cette fille votre avec sur votre "page d'accueil" facebook est hott! –

Répondre

4

Le mieux est de passer toute la partie après la/mypage/comme param au script php et avoir ce décodent:

RewriteRule ^mypage/(.*) index.php?page=mypage&params=$1 [L,NC,QSA] 

Aussi, si vous voulez la page soit dynamique:

RewriteRule ^([^/\.]+)/(.*) index.php?page=$1&params=$2 [L,NC,QSA] 

ou

RewriteRule ^([^/\.]+)(/(.*))? index.php?page=$1&params=$3 [L,QSA] 

EDIT
Ajout de la suggestion de Cal, merci Cal.

Modifier
Si je comprends bien votre commentaire correctement: (sinon s'il vous plaît expliquer). Vous pouvez simplement utiliser une instruction switch avec une action par défaut qui est le même que l'action d'index pour la variable page:

switch($_GET['page']){ 
case 'mypage': 
    doMyPageStuff(); 
break; 
case 'foo': 
    doFooStuff(); 
break; 
case 'index': 
default: 
    doIndexStuff(); 
break; 
} 
+0

La deuxième méthode est ce dont j'ai besoin de plus, mais comment puis-je ignorer le/après mypage? –

+0

que voulez-vous dire par ignorer? Si vous voulez que ce soit optionnel, faites ceci: RewriteRule^([^/\.] +) (/ (* *))? index.php?page = $ 1 & params = $ 3 [L, QSA] le NC est trop puissant, et le L peut ne pas être souhaitable, selon ce que vous faites ci-dessous – Cal

+0

Dans ces rewriteRules, le/ne sera pas ajouté au paramètre de la page , qu'est-ce que tu veux dire exactement? –

1
RewriteRule ^([^/]+)/(.+)/?$ index.php?page=$1&params=$2 

ou très similaires - pas obtenu un serveur à portée de main pour vérifier!

0

Je vois cela a déjà une réponse acceptée, mais je crois que ce qui suit fera ce que vous voulez en utilisant seulement mod_rewrite.

RewriteCond %{QUERY_STRING} ^(.*)$ 
RewriteRule ^(.*/)([^/]+)/([^/]+) $1?$2=$3&%1 [L] 
RewriteCond %{QUERY_STRING} ^(.*)$ 
RewriteRule ^([^/]+)/ $1.php?%1 [L] 

Cela fonctionne car mod_rewrite se comporte récursivement. C'est-à-dire, après chaque réécriture, la nouvelle URL est traitée à nouveau. À chaque fois, les deux valeurs à la fin sont transformées en paramètres de requête et ajoutées à la chaîne de requête.

Cela réécrire les éléments suivants

/mypage/param1/val1/param2/val2/param3/val3/...  ---> 
/mypage.php?param1=val1&param2=val2&param3=val3&... 

Il arrête quand il n'y a qu'un seul paramètre reste. Il prendra le premier "paramètre" et appellera le fichier .php avec ce nom. Il n'y a pas de limite au nombre de paires param/val.

-
BMB

1

Voilà ma proposition:

RewriteRule ^([^/]+)/(([^/]+/[^/]+(/[^/]+/[^/]+)*)/)?$ /index.php?page=$1&params=$3 [L] 

Ce n'est pas très agréable mais exaclty comme vous avez demandé. Il permet seulement les chemins de la forme:

/mypage/ 
/mypage/param1/value1/ 
/mypage/param1/value1/param2/value2/ 
/mypage/param1/value1/param2/value2/param3/value3/ 
/mypage/param1/value1/param2/value2/param3/value3/param4/value4/ 
…