2009-05-21 3 views
3

Я хотел бы переписать что-то вроде:Rewrite для всех URL-адресов

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

В

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

Я ищу решение для работы над произвольным числом переменных. Это можно сделать?

+0

Как вы приняли мой ответ, я думаю, вы должны отредактировать свой вопрос и изменить URL-адреса. Потому что мое решение переписывает запросы второй формы внутри первой формы. – Gumbo

ответ

4

Взгляните на этот вопрос: Can mod_rewrite convert any number of parameters with any names?

My answer могут быть использованы в вашем случае тоже:

$_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; 
} 

И соответствующее правило в том, что:

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

Это правило переписывает любой запрос, который не может быть сопоставлен с существующим файлом или каталогом, до index.php.

+0

Это делает обратное тому, что было запрошено. Он превращает «/ a/b/c/d» в «/index.php?a=b&c=d». Вопрос задал вопрос о том, чтобы превратить «/index.php?a=b&c=d» в «/ a/b/c/d». – Glomek

+1

Непонятно, как работает mod_rewrite или искажает то, что они ищут: «У меня есть URL-адреса, такие как /index.php?foo=bar и want/foo/bar». Но в большинстве случаев они ищут точную разницу. – Gumbo

0

Да. Хитрость заключается в том, чтобы написать RewriteRule, который заменяет один символ (знак равенства или амперсанд) косой чертой, а затем использовать флаг «следующий», который перезапускает процесс перезаписи.

Следующая может быть хорошим местом для начала:

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

Если бы я получил это право, первое правило не будет делать ничего, но только совпадают, если путь начинается с «/index.php». Опция «chain» означает, что второе правило не будет выполняться, если первое правило не соответствует. Второе правило будет пытаться заменить a = или & на /, и, если это будет успешно, оно перезапустит весь процесс перезаписи. Третье правило, которое будет достигнуто только после замены всех и = &, удалит "/index.php?" в начале.

Смежные вопросы