Мод Apache_переписывает/модифицирует_перенаправляет:преобразует URL-адрес с параметрами запроса в SEO-дружественный URL-адрес. некоторые параметры запроса игнорируются

Как указано выше.

лучше всего объяснить на примере:

  • исходный URL (порядок параметров НЕ соответствует)

  • Если я посещу любой из трех приведенных выше URL-адресов, я хочу, чтобы меня перенаправили на www.myhost.com/my-page/v1/v2

    • p3 был намеренно проигнорирован, поскольку он не нужен. больше.
    • в моем реальном URL-адресе есть параметры от p4 до p6, которые также игнорируются. Я написал только до p3 для простоты.

Я искал в сети, но ничего не сравнится с тем, что я пытаюсь сделать. Спасибо.

1
задан 26 October 2021 в 00:36
1 ответ

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

1
ответ дан 26 October 2021 в 01:57

Теги

Похожие вопросы