Переписать для всех URL - PullRequest
3 голосов
/ 21 мая 2009

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

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

В

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

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

Ответы [ 2 ]

4 голосов
/ 21 мая 2009

Посмотрите на этот вопрос: Может ли mod_rewrite преобразовать любое количество параметров с любыми именами?

Мой ответ можно использовать и в вашем случае:

$_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 голосов
/ 21 мая 2009

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...