#apache #mod-rewrite
Вопрос:
Как и выше.
возможно, лучше всего это объяснить на примере:
- исходный URL-адрес (порядок параметров НЕ соответствует)
- Если я посещу любой из 3 приведенных выше примеров URL-адресов, я хочу, чтобы меня перенаправили на www.myhost.com/my-page/v1/v2
- p3 был намеренно проигнорирован, потому что он больше не нужен.
- в моем реальном URL-адресе у меня есть параметры от p4 до p6, которые также игнорируются. Я написал только до p3 для простоты.
Я просмотрел / поискал в сети, но ничто и близко не подходит к тому, что я пытаюсь сделать. Спасибо.
Ответ №1:
Вы можете сделать это следующим образом, используя mod_rewrite:
RewriteEngine On
RewriteCond %{QUERY_STRING} (?:^|amp;)p1=([^amp;] )
RewriteCond %1@%{QUERY_STRING} ^([^@] )@(?:|.*amp;)p2=([^amp;]*)
RewriteRule ^/?(my-page)$ /$1/%1/%2 [QSD,R=302,L]
Первое условие фиксирует значение p1
и передает его второму условию , которое также фиксирует значение p2
. Затем они используются в строке подстановки как %1
и %2
обратные ссылки соответственно.
Параметры URL могут располагаться в любом порядке.
@
(во втором условии) — это просто произвольный символ, который не встречается в v1
и поэтому используется в качестве разделителя между v1
и строкой запроса при поиске p2
.
Все остальные параметры URL (т.е. p3
.. pN
) игнорируются (и отбрасываются).
Параметр p1
должен существовать с непустым значением (в противном случае результирующее перенаправление будет неоднозначным). p2
также должно существовать, но значение может быть пустым. например. /my-page?p2=amp;p1=v1
все равно будет успешно перенаправлено на /my-page/v1/
.
QSD
Флаг отбрасывает исходную строку запроса из запроса.
В зависимости от того, где используются эти директивы (например, контекст каталога или сервера) и как в конечном итоге маршрутизируется URL-адрес, вам может потребоваться добавить начальное условие, чтобы гарантировать, что обрабатываются только прямые запросы (в отличие от переписанных запросов).
Например, добавьте следующее в качестве первого условия, если требуется:
RewriteCond %{ENV:REDIRECT_STATUS} ^$
:
Обновить:
p1 и p2 являются обязательными. p3 является необязательным.
Вы можете изменить вышеизложенное следующим образом:
RewriteCond %{QUERY_STRING} (?:^|amp;)p1=([^amp;] )
RewriteCond %1@%{QUERY_STRING} ^([^@] )@(?:|.*amp;)p2=([^amp;] )
# Either p3 is mandatory and must have a value
RewriteCond %1/%2/@%{QUERY_STRING} ^([^@] )@(?:|.*amp;)p3=([^amp;] ) [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
пусто или опущено).
Комментарии:
1. Я только что понял, что p3 теперь необязателен. какие изменения мне нужно внести в дополнительные изменения, которые мне нужно внести? таким образом, p1 и p2 являются обязательными. p3 является необязательным. Еще раз спасибо.
2. @mrjayviper Я обновил свой ответ.
3. это сработало. Спасибо