2009-05-21 13 views
3

Je voudrais réécrire quelque chose comme:Réécrire pour toutes les URL

http//www.example.com/index.php?var1=val1&var2=val2&var3=val3

Dans

http://www.example.com/var1/val1/var2/val2/var3/val3/

Je suis à la recherche d'une solution pour travailler sur un nombre arbitraire de variables. Peut-il être fait?

+0

Comme vous avez accepté ma réponse, je pense que vous devriez éditer votre question et changer les URL. Parce que ma solution réécrit en interne les requêtes du second formulaire au premier formulaire. – Gumbo

Répondre

4

Jetez un oeil à cette question: Can mod_rewrite convert any number of parameters with any names?

My answer peut être utilisé dans votre cas aussi:

$_SERVER['REQUEST_URI_PATH'] = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); 
$segments = explode('/', trim($_SERVER['REQUEST_URI_PATH'], '/')); 
for ($i=0, $n=count($segments); $i<$n; $i+=2) { 
    $_GET[rawurldecode($segments[$i])] = ($i+1 < $length) ? rawurldecode($segments[$i+1]) : null; 
} 

Et la règle correspondant à celle:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule^index.php [L] 

Cette règle récrit tout demande, qui ne peut pas être mappée à un fichier ou un répertoire existant, au index.php.

+0

Cela fait l'inverse de ce qui a été demandé. Il transforme "/ a/b/c/d" en "/index.php?a=b&c=d". La question posée sur la transformation de "/index.php?a=b&c=d" en "/ a/b/c/d". – Glomek

+1

La plupart des gens comprennent mal comment mod_rewrite fonctionne ou mal interpréter ce qu'ils recherchent: «J'ai des URL comme /index.php?foo=bar et want/foo/bar.» Mais dans la plupart des cas, ils recherchent la différence exacte. – Gumbo

0

Oui. L'astuce consiste à écrire un RewriteRule qui remplace un caractère (signe égal ou esperluette) par une barre oblique, puis utiliser le drapeau "suivant" qui redémarre le processus de réécriture.

Ce qui suit pourrait être un bon endroit pour commencer:

RewriteRule ^/index.php - [chain] 
RewriteRule ^(.*)[=&](.*)$ $1/$2 [next] 
RewriteRule ^/index.php\? "/" 

Si je suis arrivé ce droit, la première règle ne fera rien, mais ne fonctionne que si le chemin commence par « index.php ». L'option "chaîne" signifie que la deuxième règle ne sera pas exécutée à moins que la première règle ne corresponde. La deuxième règle va essayer de remplacer an = ou & par un /, et si elle réussit, elle redémarrera tout le processus de réécriture. La troisième règle, qui ne sera atteinte après que tous les = et & ont été remplacés, va supprimer le "/index.php?" au début.

Questions connexes