Як замінити всі посилання в файлах і базі даних сайту

Ця стаття буде бонусної в циклі про боротьбу зі змішаним контентом при перенесенні сайту з 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 – пошук за виразом;
  • I – відобразити знайдені файли списком;
  • 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. В кінці не забудьте перевірити, що в результаті все працює правильно і відновіть дані з бекапу в іншому випадку. Ви ж зробили бекап перед початком робіт?

Ось і все, тепер ви знаєте, як знайти і замінити будь-який текст у всіх файлах, де він зустрічається. Якщо ви відчуваєте невпевненість в такій відповідальній справі – ми завжди раді вам допомогти!