Вы можете сделать это следующим образом, используя mod_rewrite:
RewriteEngine включен
RewriteCond %{QUERY_STRING} (?:^|&)p1=([^&]+)
RewriteCond %1@%{QUERY_STRING} ^([^@]+)@(?:|.*&)p2=([^&]*)
Правило перезаписи ^/?(моя-страница)$ /$1/%1/%2 [QSD,R=302,L]
Первое условие фиксирует значение р1 и передает это второму условие который также фиксирует значение р2. Затем они используются в замена строка как %1 и %2 обратные ссылки соответственно.
Параметры URL могут встречаться в любом порядке.
@ (во втором условии) — просто произвольный символ, не встречающийся в v1 и поэтому используется в качестве разделителя между v1 и строка запроса при поиске р2.
Все остальные параметры URL (т. р3..рН) игнорируются (и отбрасываются).
Обе р1 и р2 должен существовать с непустым значением, чтобы произошло перенаправление.
ОБНОВИТЬ: р1 должен существовать с непустым значением (иначе результирующее перенаправление будет неоднозначным). р2 также должно существовать, но значение может быть пустой. Я также обновил регулярное выражение, чтобы оно также допускало, возможно, искаженную (но все еще действительную) строку запроса, где разделитель параметра URL (&) происходит раньше р2 в самом начале строки запроса. например. /моя-страница?&p2=&p1=v1 все равно будет перенаправлен на /моя-страница/v1/.
QSD флаг отбрасывает исходную строку запроса из запроса.
В зависимости от того, где используются эти директивы (например. каталог или же сервер контексте) и как URL-адрес в конечном итоге маршрутизируется, вам может потребоваться добавить начальное состояние чтобы гарантировать, что обрабатываются только прямые запросы (в отличие от переписанных запросов).
Например, добавьте следующее в качестве первого условия, если требуется:
Условия перезаписи %{ENV:REDIRECT_STATUS} ^$
:
ОБНОВИТЬ:
p1 и p2 являются обязательными. p3 является необязательным.
Вы можете изменить вышеуказанное следующим образом:
RewriteCond %{QUERY_STRING} (?:^|&)p1=([^&]+)
RewriteCond %1@%{QUERY_STRING} ^([^@]+)@(?:|.*&)p2=([^&]+)
# Либо p3 является обязательным и должен иметь значение
RewriteCond %1/%2/@%{QUERY_STRING} ^([^@]+)@(?:|.*&)p3=([^&]+) [ИЛИ]
# ИЛИ p3 опущен или не имеет значения
RewriteCond %1/%2 (.+)
Правило перезаписи ^/?(моя-страница)$ /$1/%1%2 [QSD,R,L]
2-е условие теперь гарантирует наличие значения для р2 параметр (т. v2) - не может быть пустым.
Затем либо 3-е условие проверяет непустое р3 параметр ИЛИ ЖЕ 4-е условие просто фиксирует значения, когда р3 параметр либо пуст, либо вообще опущен.
Результирующее перенаправление опускает завершающую косую черту, когда р3 нет. Например, результирующее перенаправление либо /моя страница/v1/v2 или же /моя страница/v1/v2/v3. (Конечная косая черта, которая в противном случае могла бы появиться на /моя страница/v1/v2/ избегается.)
В финале замена строка, значения %1 и %2 обратные ссылки немного отличаются от предыдущих. Они больше не содержат каждое значение (т. v1 и v2). Вместо %1 содержит v1/v2 и %2 содержит либо /v3 (включая префикс косой черты) или пустой (когда р3 пусто или опущено).