Рейтинг:1

Apache mod_rewrite/mod_redirect: преобразование URL-адреса с параметрами запроса в SEO-дружественный URL-адрес. некоторые параметры запроса игнорируются

флаг cl

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

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

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

Рейтинг:1
флаг kz

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

флаг cl
Дай мне попробовать. Спасибо
флаг kz
@mrjayviper Я обновил свой ответ, чтобы разрешить _пустой_ (но все еще присутствующий) параметр `p2`. И разрешить, возможно, искаженную (но все еще действительную) строку запроса, в которой разделитель параметра URL (`&`) стоит непосредственно перед `p2` в самом начале строки запроса. например. `/my-page?&p2=&p1=v1` (пограничный случай).
флаг cl
Я только что понял, что p3 теперь необязателен. какие изменения мне нужно внести дополнительные изменения мне нужно сделать? поэтому p1 и p2 обязательны. p3 является необязательным. Спасибо.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.