Перенаправления файлов
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"