Почему RewriteRule не работает?

Есть строка /game/rebus/1/, может быть /game/rebus?page=3&perpage=10 с разными параметрами.
Правило редиректа:
RewriteRule ^game/([\w]*)\/*([\w\d]*)\/*\?*([\w\d\&\=]*) game.php?type=$1&id=$2&$3 [NC,L]
В первом случае все работает нормально, во втором подстрока page=3&perpage=10 в запрос не попадает.
Как правильно сделать?


Ответы (2 шт):

Автор решения: SergeyPopov

Ваше правило RewriteRule не учитывает тот факт, что параметры могут отсутствовать или быть пустыми. Поэтому вы можете использовать следующее правило:

RewriteRule ^game/([\w]*)/?([\w\d]*)/?(\?[\w\d\&\=]*)?$ game.php?type=$1&id=$2&$3 [NC,L]

В этом правиле я добавил знак вопроса (?) в конце каждой группы квантификатора, чтобы указать, что эти группы могут быть необязательными. Также я добавил опцию (?[\w\d&=]*)? для обработки параметров запроса, которые могут отсутствовать или быть пустыми.

Обратите внимание, что в этом правиле я использую квантификатор + вместо *, чтобы указать, что эти группы должны содержать хотя бы один символ. Это поможет избежать ситуаций, когда в запросе параметры отсутствуют, но в вашем правиле они учитываются.

Например, учитывая это правило, строка /game/rebus/1/ будет разобрана следующим образом:

type будет равно rebus
id будет равно 1
$3 будет пустым

А строка /game/rebus?page=3&perpage=10 будет разобрана следующим образом:

type будет равно rebus
id будет пустым
$3 будет равно page=3&perpage=10
→ Ссылка
Автор решения: fixer

После многих проб мне удалось таки добиться того, что нужно. Так как часть после ? упорно игнорировалась в RewriteRule, попробовал вынести определение подстроки в RewriteCond и все заработало.

RewriteCond %{QUERY_STRING} \??(.*)$
RewriteRule ^game/([\w]*)/*([\w\d]*)/* game.php?type=$1&id=$2&%1 [NC,L]
→ Ссылка