Вопрос или проблема
Я хочу перенаправить URL-адреса (с параметрами) с моего старого домена на URL-адреса (без параметров) на моем новом домене.
URL-адреса выглядят так:
-
old-domain.com/deceased-persons-2021/?id=1500_betty-white
(id=1500_
должен исчезнуть) -
new-domain.com/deceased-persons/2021/betty-white
Проблема в том, что мне не нужно управлять только значением id=1500_betty-white
параметра как обратной ссылкой, но и годом 2021
, потому что у меня очень много URL-адресов.
Если бы URL-адреса были только old-domain.com/deceased-persons-2021
ИЛИ только old-domain.com/deceased-persons/?id=1500_betty-white
, я бы знал решения. Но я не знаю, как управлять обратной ссылкой в URL в сочетании с обратной ссылкой в параметре. Как я могу это решить?
Поскольку вы изменили URL (и изменили домен), это должно быть внешнее “перенаправление”, в отличие от “перезаписи” (или “пересылки”), так как вам нужно перенаправить пользователя/поисковую систему/бота.
Я предполагаю, что old-domain.com
и new-domain.com
указывают на разные серверы. Если нет, то вам потребуется дополнительное условие (директива RewriteCond
), которое проверяет запрашиваемое имя хоста (HTTP_HOST
).
Если бы URL-адреса были только old-domain.com/deceased-persons-2021 ИЛИ только old-domain.com/deceased-persons/?id=1500_betty-white, я бы знал решения.
Я бы подумал, что если вы знаете, как сделать эти перенаправления по отдельности, то вы знаете, как сделать их вместе, потому что вы просто объединяете их, так что было бы интересно увидеть, как вы бы решили эти задачи по отдельности.
Захват части пути URL (например, 2021
) из шаблона RewriteRule
создает обратную ссылку в виде $n
(где n
– число от 0 до 9). Тогда как захват части строки запроса (для чего требуется предшествующее условие) создает обратную ссылку в виде %n
. Затем вы используете $n
и %n
в подстановочной строке.
Например:
# /deceased-persons-2021 to /deceased-persons/2021
RewriteRule ^deceased-persons-(\d{4})$ https://new-domain.com/deceased-persons/$1 [R=301,L]
Обратная ссылка $1
содержит захваченный 4-значный год из конца пути URL.
# /deceased-persons/?id=1500_betty-white to /deceased-persons/betty-white
RewriteCond %{QUERY_STRING} ^id=\d+_([a-z-]+)$
RewriteRule ^deceased-persons/$ https://new-domain.com/deceased-persons/%1 [QSD,R=301,L]
Обратная ссылка %1
содержит захваченное имя из предыдущего условия (директива RewriteCond
). В этом примере часть имени может содержать только строчные буквы a-z и дефисы.
Флаг QSD
необходим для сброса исходной строки запроса.
Объединение этих двух правил…
# /deceased-persons-2021/?id=1500_betty-white to /deceased-persons/2021/betty-white
RewriteCond %{QUERY_STRING} ^id=\d+_([a-z-]+)$
RewriteRule ^deceased-persons-(\d{4})/$ https://new-domain.com/deceased-persons/$1/%1 [QSD,R=301,L]
Лично я бы также захватил часть пути URL deceased-persons
, чтобы избежать повтора. Например:
RewriteCond %{QUERY_STRING} ^id=\d+_([a-z-]+)$
RewriteRule ^(deceased-persons)-(\d{4})/$ https://new-domain.com/$1/$2/%1 [QSD,R=301,L]
Это правило должно идти вначале корневого файла .htaccess
на old-domain.com
.
Это предполагает, что имя (в строке запроса) состоит только из строчных букв и дефисов. Если, однако, может быть “дополнительная цифра в слаге”, то вам потребуется изменить регулярное выражение соответственно.
Сначала протестируйте с 302 (временным) перенаправлением, чтобы избежать возможного кэширования перенаправления и измените на 301 только когда убедитесь, что это работает как задумано. 301 (постоянные) перенаправления кэшируются браузером на постоянной основе, что может затруднить тестирование.
.
Ответ или решение
В профессиональной IT-среде, особенно когда речь идет о миграции сайта на новый домен, крайне важно правильно организовать перенаправление URL-адресов. Перенаправление URL с параметрами с вашего старого домена на новый, но уже без параметров, является довольно распространенной задачей в администрировании веб-серверов. Давайте подробно разберем решение данной задачи, используя возможности .htaccess и модуля mod_rewrite в сервере Apache.
Теория
Перенаправление и переписывание URL:
Переписывание URL – это изменение внутреннего отображения URL без изменения адресной строки, видимой пользователю. Это полезно для внутренней оптимизации, но в вашем случае, так как меняется домен, необходима внешняя переадресация. Она указывает поисковым системам и браузерам на то, что адрес изменился, и позволяет сохранить SEO-рейтинги.
Использование модификаторов в .htaccess:
Для решения вашей задачи потребуется модуль mod_rewrite, который позволяет "ловить" и изменять URL-адреса по заданным условиям. Основными директивами здесь будут RewriteRule для указания шаблонов URL и RewriteCond для дополнительных условий на основе строки запроса.
Обработка параметров:
В случае, описанном вами, важно не только перенаправлять URL, но и правильно извлекать и использовать параметры. Так, год и идентификатор с именем человека, составляющие параметры URL, должны быть обработаны корректно. В .htaccess используются обратные ссылки: $n
для частичной отработки пути URL и %n
для обработки параметров строки запроса.
Пример
Шаги по созданию правил перенаправления:
-
Удаление параметра
id
:
Для этой задачи мы должны извлечь часть параметраid
, не включая цифры и знак подчеркивания, и включить это в новый URL. -
Извлечение года из пути URL:
Используем регулярные выражения для извлечения значения года, чтобы его можно было динамично использовать в новом URL. -
Объединение условий и правил в общую директиву:
Для комплексного решения задачи все правила и условия необходимо объединить в одной директиве mod_rewrite.
Код:
RewriteEngine On
# Перенаправление URL с параметром и годом
RewriteCond %{QUERY_STRING} ^id=\d+_([a-z-]+)$
RewriteRule ^deceased-persons-(\d{4})/$ https://new-domain.com/deceased-persons/$1/%1 [QSD,R=301,L]
Расшифровка кода:
RewriteEngine On
— активирует модуль mod_rewrite, позволяя использовать его возможности.RewriteCond %{QUERY_STRING} ^id=\d+_([a-z-]+)$
— условие, проверяющее, соответствует ли строка запроса заданному шаблону (id
должен начинаться с какого-то числа и знака подчеркивания, за которым следуют символы латиницы и дефисы).RewriteRule ^deceased-persons-(\d{4})/$ https://new-domain.com/deceased-persons/$1/%1 [QSD,R=301,L]
— правило, изменяющее URL. Оно захватывает четырёхзначное число (год) из пути и имя из параметра, формируя новый URL. ФлагQSD
(Query String Discard) исключает строку запроса в новом URL, аR=301
иL
указывают на постоянное перенаправление.
Применение
Шаги для внедрения в .htaccess:
-
Размещение правил:
Поместите указанные правила в корневой файл .htaccess вашего старого домена. -
Тестирование:
Используйте временное перенаправление (302), чтобы проверить работу перед тем, как переключаться на постоянное (301). Постоянные перенаправления могут кэшироваться браузерами, что может затруднить тестирование. -
Мониторинг и коррекция:
После внедрения необходимо наблюдать динамику и корректность работы перенаправлений, использовать инструменты аналитики для отслеживания ошибок.
Дополнительные рекомендации:
- Если предполагается, что URL может содержать и другие символы, кроме указанных, необходимо адаптировать регулярное выражение.
- Следите за изменениями в архивах и администрировании сайта, так как неправильные перенаправления могут повлиять на индексирование и SEO.
- Убедитесь, что все rewrite правила протестированы в различных сценариях использования, чтобы избежать потери трафика и ошибочных перенаправлений.
Такое систематическое и полное решение обеспечит успешный перевод ссылок с учетом важности SEO и пользовательского опыта.