Проблема с аргументами запроса URI заключается в том, что они могут появляться в любом порядке. С двумя аргументами у вас есть только две перестановки ( A до B и B до A ). Но чем больше аргументов вы хотите извлечь, тем больше у вас перестановок ( n ! ).
Это означает, что вы должны располагать аргументы в правильном порядке, чтобы вы могли их одновременно:
RewriteCond %{THE_REQUEST} ^GET\ /view\.php
RewriteCond %{QUERY_STRING} ^(([^&]*&)*)(page=[^&]+)&?([^&].*)?$
RewriteCond %3&%1%4 ^(([^&]*&)*)(user=[^&]+)&?([^&].*)?$
RewriteCond %3&%1%4 ^user=([^&]+)&page=([^&]+)&?([^&].*)?$
RewriteRule ^view\.php$ /%1/%2?%3 [L,R=301]
Первое условие проверяет строку запроса, как в вашем правиле. Второе условие выбирает аргумент page и помещает его в начало строки запроса. Третье условие делает то же самое с аргументом user , так что порядок всегда такой: первый user , второй page . Затем мы используем четвертое условие, чтобы одновременно принимать оба значения аргумента, чтобы использовать их в замене RewriteRule
. Остальная часть запроса добавляется к замещающему URI (см. %3
), но вы можете оставить это, если хотите.
Как видите, чем больше аргументов вы хотите извлечь, тем сложнее это становится. И это проще сделать с помощью языка, более мощного, чем mod_rewrite, например PHP.