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

#apache #mod-rewrite

Вопрос:

Как и выше.

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

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

Ответ №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. это сработало. Спасибо