Как указано выше.
лучше всего объяснить на примере:
исходный URL (порядок параметров НЕ соответствует)
Если я посещу любой из трех приведенных выше URL-адресов, я хочу, чтобы меня перенаправили на www.myhost.com/my-page/v1/v2
Я искал в сети, но ничего не сравнится с тем, что я пытаюсь сделать. Спасибо.
Вы можете сделать это следующим образом, используя мод _rewrite:
RewriteEngine On
RewriteCond %{QUERY_STRING} (?:^|&)p1=([^&]+)
RewriteCond %1@%{QUERY_STRING} ^([^@]+)@(?:|.*&)p2=([^&]*)
RewriteRule ^/?(my-page)$ /$1/%1/%2 [QSD,R=302,L]
Первое условие фиксирует значение p1
и передает его второму условие , которое также фиксирует значение p2
. Затем они используются в строке замены как обратные ссылки %1
и %2
соответственно.
Параметры URL могут встречаться в любом порядке.
@
(во втором условии )— это просто произвольный символ, который не встречается в v1
и поэтому используется в качестве разделителя между v1
и строкой запроса при поиске p2
.
Все остальные параметры URL (, т.е. p3
..pN
)игнорируются (и отбрасываются ).
И p1
, и p2
должны существовать с не пустым значением -, чтобы произошло перенаправление.
ОБНОВЛЕНИЕ:p1
должно существовать с не -пустым значением (, иначе результирующее перенаправление будет неоднозначным ). p2
также должен существовать, но значение может быть пустым . Я также обновил регулярное выражение, чтобы оно также допускало, возможно, искаженную (, но все еще действительную строку запроса ), где разделитель параметра URL(&
)встречается перед p2
в самом начале строки запроса. например. /my-page?&p2=&p1=v1
все равно будет перенаправлено на /my-page/v1/
.
Флаг QSD
отбрасывает исходную строку запроса из запроса.
В зависимости от того, где используются эти директивы (, например. каталог или сервер контекст )и то, как URL-адрес в конечном итоге маршрутизируется, вам может потребоваться добавить начальное условие , чтобы гарантировать, что только прямые запросы (] в отличие от переписанных запросов ).
Например, добавьте следующее в качестве первого условия, если требуется.:
RewriteCond %{ENV:REDIRECT_STATUS} ^$
:
ОБНОВЛЕНИЕ:
p1 и p2 являются обязательными. p3 является необязательным.
Вышеприведенное можно изменить следующим образом.:
RewriteCond %{QUERY_STRING} (?:^|&)p1=([^&]+)
RewriteCond %1@%{QUERY_STRING} ^([^@]+)@(?:|.*&)p2=([^&]+)
# Either p3 is mandatory and must have a value
RewriteCond %1/%2/@%{QUERY_STRING} ^([^@]+)@(?:|.*&)p3=([^&]+) [OR]
# OR p3 is omitted or does not have a value
RewriteCond %1/%2 (.+)
RewriteRule ^/?(my-page)$ /$1/%1%2 [QSD,R,L]
2-е условие теперь обеспечивает наличие значения для параметра p2
(, т.е.v2
)-он не может быть пустым.
Затем либо 3-е условие проверяет наличие не -пустого p3
параметра , ИЛИ 4-е условие просто фиксирует значения, когда параметр p3
либо пуст, либо вообще опущен.
Результирующее перенаправление пропускает завершающую косую черту, когда p3
отсутствует. Например, результирующее перенаправление будет либо /mypage/v1/v2
, либо /mypage/v1/v2/v3
. (Завершающая косая черта, которая в противном случае могла бы появиться в /mypage/v1/v2/
, не используется.)
В окончательной строке замены значения обратных ссылок %1
и %2
немного отличаются от предыдущих. Они больше не содержат каждое значение (, т.е. v1
и v2
). Вместо этого %1
содержит v1/v2
, а %2
содержит либо /v3
(, включая префикс косой черты ), либо пусто (, когда p3
пусто или опущено ).