Магазин переїхав на новий домен, вітрина відкривається, а адмінка вперто перекидає на стару адресу. Або інший варіант: сторінки нібито працюють, але верстка розсипалася, картинки зникли, а консоль браузера завалена помилками mixed content і посиланнями на домен, якого вже не існує. Обидві ситуації мають одну причину: адреса сайту в OpenCart прописана не в одному місці, і змінити її «в налаштуваннях» неможливо, бо такого пункту в адмінці просто немає.
Розберімо, де насправді живе адреса магазину і що треба зачепити, аби переїзд пройшов без втрат.
Де OpenCart зберігає адресу
Не в базі даних, як багато хто очікує. Базова адреса задається константами у двох файлах:
config.phpу корені сайту, для вітрини;admin/config.php, для панелі керування.
У кореневому файлі для OpenCart 3.x це виглядає так:
// HTTP
define('HTTP_SERVER', 'https://newshop.ua/');
// HTTPS
define('HTTPS_SERVER', 'https://newshop.ua/');
В адмінському файлі констант більше, і саме його найчастіше забувають:
// HTTP
define('HTTP_SERVER', 'https://newshop.ua/admin/');
define('HTTP_CATALOG', 'https://newshop.ua/');
// HTTPS
define('HTTPS_SERVER', 'https://newshop.ua/admin/');
define('HTTPS_CATALOG', 'https://newshop.ua/');
Два моменти, на яких спотикаються найчастіше.
Перший: слеш у кінці адреси обов'язковий. Без нього OpenCart склеїть шляхи неправильно, і ви отримаєте биті посилання виду https://newshop.uaindex.php.
Другий: якщо папку адмінки перейменовано (а для безпеки її варто перейменовувати), у HTTP_SERVER адмінського конфіга має стояти саме нова назва папки, не admin.
Симптом забутого admin/config.php упізнається одразу: вітрина працює на новому домені, а спроба зайти в адмінку закінчується редиректом на старий або нескінченним колом на сторінці логіна. Стара адреса в кореневому config.phpпроявляється інакше: сторінка відкривається, але стилі, скрипти й зображення движок генерує зі старим доменом. Далі два варіанти. Якщо старий домен уже мертвий, ресурси просто не вантажаться і в консолі сипле ERR_NAME_NOT_RESOLVED. Якщо він ще живий і відповідає через http, браузер ріже такі запити як mixed content, і магазин виглядає голим HTML без оформлення.
Порядок дій при переїзді
- Відредагуйте обидва
config.php: замініть стару адресу на нову в усіх константах, з протоколом і слешем у кінці. - Очистіть кеш: видаліть вміст
system/storage/cache/(сам каталог лишіть). - Перевірте
.htaccessу корені: якщо там були правила з жорстко прописаним старим доменом (редиректи, RewriteCond по HTTP_HOST), оновіть їх.
На цьому етапі магазин уже відкривається за новою адресою. Але зупинятися рано, бо стара адреса нікуди не зникла: вона сидить у контенті.
Залишки старої адреси в базі
Константи в конфігах відповідають лише за генерацію посилань самим движком. Усе, що вводили руками, лишилося як було: абсолютні посилання на картинки в описах товарів, лінки в статтях, банери, налаштування модулів. Класична картина після переїзду: товар відкривається на новому домені, а зображення в описі тягнуться зі старого. Якщо той уже вимкнений — биті картинки, якщо ще працює через http — той самий mixed content, тільки цього разу з контенту, а не з конфігів.
Пройдіться по таблицях з описами:
UPDATE oc_product_description
SET description = REPLACE(description, 'https://oldshop.ua', 'https://newshop.ua');
UPDATE oc_category_description
SET description = REPLACE(description, 'https://oldshop.ua', 'https://newshop.ua');
UPDATE oc_information_description
SET description = REPLACE(description, 'https://oldshop.ua', 'https://newshop.ua');
Перед будь-яким масовим UPDATE зробіть дамп бази. Хоч ріжте, але без бекапа такі запити ганяти не можна: один неточний REPLACE, і відкочуватися буде нікуди.
301-редиректи та Search Console
Технічно магазин переїхав, але для Google це поки два різні сайти з однаковим контентом. Якщо старий домен ще у вашій власності, налаштуйте з нього постійний редирект на новий, посторінково, а не все на головну.
Для NGINX це окремий server-блок:
server {
listen 443 ssl;
server_name oldshop.ua www.oldshop.ua;
return 301 https://newshop.ua$request_uri;
}
Для Apache — правило в .htaccess старого сайту:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^(www\.)?oldshop\.ua$ [NC]
RewriteRule ^(.*)$ https://newshop.ua/$1 [R=301,L]
Далі йдіть у Search Console: додайте новий домен як окремий ресурс, підтвердіть його і скористайтеся інструментом «Зміна адреси» на старому ресурсі. Це прискорює переклеювання позицій, хоча повний переїзд в очах пошуковика все одно розтягнеться на тижні. Не забудьте оновити sitemap (у стандартному OpenCart він генерується за адресою index.php?route=extension/feed/google_sitemap уже з новим доменом, але посилання на нього в robots.txt і в самій Search Console треба замінити руками) і перевірити robots.txt, якщо там був прописаний абсолютний шлях до карти сайту.
І тримайте редирект зі старого домену живим щонайменше рік. Скидати його через місяць, «бо вже все переїхало», означає подарувати конкурентам вагу всіх зовнішніх посилань, які роками вели на стару адресу.
Чек-лист після зміни адреси
- Нова адреса зі слешем у кінці в
config.phpіadmin/config.php(усі константи, включно зHTTP_CATALOG) - Кеш
system/storage/cache/очищено - Адмінка відкривається і не редиректить на стару адресу
- Стилі, скрипти й зображення вантажаться з нового домену (перевірка в консолі браузера)
- Описи товарів, категорій та статей перевірено на абсолютні посилання, база забекаплена перед REPLACE
- 301-редирект зі старого домену працює посторінково
- Search Console: новий ресурс додано, «Зміну адреси» запущено, sitemap оновлено
- Головна, категорія і картка товару відкриті вручну: без битих картинок і помилок mixed content у консолі