Назад | Перейти на главную страницу

.htaccess 301 редирект для URL без учета его параметров

Перенаправления файлов

Redirect 301 /products.php http://example.com/product_123.php

и перенаправления домена

Redirect 301 / http://www.example.com/

легко. Однако я хочу перенаправить некоторые URL-адреса, игнорируя все параметры, т.е.

example.com/slug1/slug2/slug3?pagination=1
example.com/slug1/slug2/slug3?ref=2
example.com/slug1/slug2/slug3?day=Monday
example.com/slug1/slug2/slug3?referer=Google 
example.com/slug1/slug2/slug3?referer=Facebook
... etc  

все должны перенаправить на

example.com/slug4

Если вы хотите просто игнорировать все параметры, то вы все равно можете использовать стандартный Redirect, потому что это так соответствие префикса и в любом случае не соответствует строке запроса. Например:

Redirect 301 /slug1/slug2/slug3 /slug4

Над Redirect 301-перенаправляет все URL-адреса в вопросе (т. е. все URL-адреса, начинающиеся /slug1/slug2/slug3) к /slug4.

Однако любая строка запроса на запрошенном URL-адресе также будет передана на целевой URL-адрес без изменений. Так, /slug1/slug2/slug3?ref=2 будет перенаправлен на /slug4?ref=2. Если это нежелательно, и вы хотите полностью удалить строку запроса* 1, тогда вам нужно будет использовать mod_rewrite (т.е. RewriteRule), а не mod_alias (т.е. Redirect или RedirectMatch, как предлагается в другом ответе), чтобы явно полностью удалить строку запроса из целевого URL. Например:

RewriteEngine On
RewriteRule ^slug1/slug2/slug3$ /slug4? [R=301,L]

В ? в конце RewriteRule подстановка приведет к удалению строки запроса из целевого URL (в качестве альтернативы вы можете использовать QSD флаг на Apache 2.4+). Строка запроса не соответствует RewriteRule шаблон, поэтому в этом отношении вам не нужно ничего делать, если только вам не нужно сопоставить определенные строки запроса или только тогда, когда действительно есть строка запроса (указанное выше будет соответствовать независимо от того, присутствует строка запроса или нет).

Дополнительное предостережение при переходе на перенаправление mod_rewrite заключается в том, что в идеале вы должны изменить любые существующие перенаправления mod_alias на эквивалентный синтаксис mod_rewrite. Это сделано для того, чтобы избежать возможных конфликтов, поскольку два модуля выполняются в разное время.

* 1 Обратите внимание, что вы можете просто добавить ? (т.е. пустая строка запроса) в конце целевого URL с Redirect или RedirectMatch директивы. Однако конечный ? фактически включен в перенаправленный URL, а не полностью удаляется, как в случае с mod_rewrite RewriteRule директива.

Вот где вам следует использовать RedirectMatch директива с сопоставлением регулярных выражений вместо простого Redirect.

Может быть, что-то вроде:

 RedirectMatch 301 "/slug1/slug2/slug3(.*)$" "/slug4"