Вы можете сделать это следующим образом, используя 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
пусто или опущено).