mod_rewrite с неизвестным количеством переменных - PullRequest
0 голосов
/ 23 января 2010

Я пытаюсь использовать mod_rewrite для обработки неизвестного числа переменных.

Пример URL будет:

example.com / var1 var2-var3-/ название

Пока у меня есть это:

RewriteRule ^([^/.]+)-([^/]*)(.*)$ $3?version[]=$1&version[]=$2 [QSA,N]
RewriteRule ^([^/.]+)/?$ ?title=$1 [QSA,N]
RewriteRule ^/?$ /index.php [QSA,L]

Это возвращает: Array ([title] => title [version] => Array ([0] => var1-var2 [1] => var3))

Мне нужно вернуть: Array ([title] => title [version] => Array ([0] => var1 [1] => var2 [2] => var3))

1 Ответ

3 голосов
/ 23 января 2010

Я не думаю, что вы можете захватить произвольное количество аргументов в одном регулярном выражении RewriteRule. Не проще ли перенаправить на index.php?version=var-var2-var3, чем в PHP сделать explode() на $_POST['version']?

РЕДАКТИРОВАТЬ: Вы можете сделать это для ограниченного числа переменных (9 - максимальное число захваченных подгрупп я считаю), а затем удалить избыточные пустые записи. Гораздо более простой вариант взрыва (), на мой взгляд, но вы идете:

# Convert up to 8 arguments.
RewriteRule ^/([^-]+)-(?:([^-]+)-)?(?:([^-]+)-)?(?:([^-]+)-)?(?:([^-]+)-)?(?:([^-]+)-)?(?:([^-]+)-)?(?:([^-]+)-)?/(.*)$ index.php?t=$9&v[]=$1&v[]=$2&v[]=$3&v[]=$4&v[]=$5&v[]=$6&v[]=$7&v[]=$8
# Strip empty ones.
RewriteRule [?&]v\[\]=$ "" [N]

Вы также можете выполнить сложный цикл, перемещая одну переменную в новый формат при каждом запуске движка перезаписи и продолжайте его до тех пор, пока у вас не закончатся vars, но я думаю, что это не просто механизм переписывания URL для.

РЕДАКТИРОВАТЬ 2: Хорошо, вот цикл, который я упомянул:

RewriteEngine on
RewriteRule ^(.*)/([^/]+)$ $1&page=$2 [L]
RewriteRule ^([^-]+)-(.*)?$ $2&v[]=$1 [L]
RewriteRule ^(?!index\.php)([^-]+)$ /index.php?v[]=$1 [L]

Преобразует пример URL следующим образом:

var1-var2-var3/title                             <-- Original
var1-var2-var3&page=title
var2-var3&page=title&v[]=var1
var3&page=title&v[]=var1&v[]=var2
index.php?v[]=var3&page=title&v[]=var1&v[]=var2  <-- Final
...