Как заменить все ссылки в файлах и базе данных сайта

Эта статья будет бонусной в цикле о борьбе со смешанным контентом при переносе сайта с http на https. Описанные здесь методы обычно используются нашими специалистами техподдержки и предназначены для опытных пользователей хостинга в режиме командной строки (SSH).

Зачем может потребоваться замена ссылок в файлах и базе данных?

В зависимости от используемой CMS или структуры скриптов, если сайт самописный, в коде могут быть указаны как относительные ссылки, так и абсолютные. Относительные ссылки выглядят так:

<img src="/wp-content/themes/default/app/img/header/logo.png" alt="Company logo">

Абсолютные так:

<img src="https://site.com/wp-content/themes/default/app/img/header/logo.png" alt="Company logo">

Относительные ссылки так называются потому, что они указывают на путь к ресурсу относительно чего-либо — домена, корневой папки сайта, любой другой папки на сервере. При этом базовая папка или URL указывается один раз в каком-то файле настроек.

Если у вас используются абсолютные ссылки, то вам может потребоваться их заменить на новые в таких ситуациях:

  • перенос сайта на новое доменное имя или создание dev-копии;
  • переход на протокол https;
  • перемещение файлов сайта на другой сервер, где иная структура каталогов, и путь к папке сайта изменился;

Конечно же, лучшим вариантом будет изначально вести разработку с использованием относительных ссылок. Но наш 18-летний опыт показывает, что не все в мире идеально🙃. И что не каждый, разрабатывая сайт много лет назад, задумывался о таких вещах🤔.

Важное предупреждение!

Перед началом выполнения каких-либо действий, описанных далее, убедитесь, что у вас есть рабочий бекап изменяемых файлов. Потому что могут возникнуть ошибки, устранить которые гораздо проще и быстрее, просто откатив изменения. Инструкция по замене будет актуальна только для тарифов хостинга и серверов на базе Linux.

Изменение ссылок в файлах и базе данных сайта

Все работы выполняются через командную строку с использованием SSH-подключения или терминала в cPanel или другой панели управления сервером. Если у вас тариф общего хостинга, нужно попросить техподдержку активировать SSH-доступ для вашего аккаунта. Если у вас услуга VPS или выделенного сервера, то у вас всегда есть полный root-доступ к серверу.

После подключения переходим в папку вашего сайта или папку, в которой нужно провести замену:

~$ cd /home/username/public_html/

Если замену также нужно провести в базе данных, то нужно создать дамп базы в формате .sql и поместить в этой же папке. Не забудьте удалить потом файл дампа из папки в целях безопасности.

~$ mysqldump -u db_user -p db_name > db_name.sql

db_user, db_name — имя пользователя сервера MySQL и имя базы.

Начинаем поиск и замену:

~$ grep -liR "old phrase" ./ | xargs replace "old phrase" "new phrase" -- {}

Разберем пошагово, что делает команда:

  • grep — поиск по выражению;
  • l — отобразить найденные файлы списком;
  • i — игнорировать регистр найденных выражений, то есть будут найдены выражения, записанные как строчными, так и прописными буквами или их комбинацией (использовать по необходимости);
  • R — рекурсивный поиск во всех файлах и каталогах, начиная с указанного каталога;
  • «old phrase» — что мы ищем, например имя старого домена вашего сайта, протокол «http://», путь к папке на сервере, и что угодно еще;
  • ./ — каталог, в котором искать; данная запись означает текущий каталог, где вы сейчас находитесь;
  • |  — символ передачи результата вывода другой программе, то есть, весь вывод команды grep будет передан на вход другой программе, написанной далее;
  • xargs — команда обычно сопровождает предыдущий символ перенаправления вывода, передает ваш список файлов следующей программе;
  • replace — как понятно из названия, производит замену одного выражения на другое, выражения указаны в кавычках следом; команда заканчивается двумя дефисами, после которых идет имя файла или файлов для обработки; в нашем случае там написаны фигурные скобки что означает: поместить переданные аргументы от предыдущего потока сюда.

Это самый простой вариант замены, если бы не одна проблема: replace — это компонент пакета программ mysql-сервера, который объявлен устаревшим и скоро будет удален из актуальных версий MySQL.

Потому вот второй способ замены с использованием альтернативной программы sed. Эта программа сама умеет искать вхождения по ключевому выражению, потому помощь grep здесь не требуется.

~$ sed -i 's|old_phrase|new_phrase|g' ./

Вообще, sed — это очень многофункциональный пакет, чтобы описать все его возможности и способы применения, потребуется написать целую книгу. Потому мы здесь даже не станем пытаться это сделать в рамках одной статьи.

Сам процесс поиска и замены может быть как почти мгновенным, так и занимать часы. Это зависит от количества файлов, которые требуется обработать. По завершению не забудьте обратно импортировать дамп базы данных, чтобы изменения применились:

~$ mysql -u db_user -p db_name < db_name.sql

Замечания

  1. Перед началом замены рекомендуется закрыть доступ к сайту из вне каким-либо образом, например включить режим обслуживания в вашей CMS.
  2. Затем нужно сбросить весь файловый кеш — это уменьшит число обрабатываемых файлов, а также поможет избежать нарушения целостности данных. После замены рекомендуем еще раз удалить кеш.
  3. Не рекомендуется делать подобные манипуляции на WordPress: из-за использования сериализированных массивов данных в БД целостность информации нарушается в любом случае. Потому для WordPress нужно использовать специализированные инструменты.
  4. В конце не забудьте проверить, что в результате все работает корректно и восстановите данные из бекапа в противном случае. Вы же сделали бекап перед началом работ?

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