OpenCart: ЧПУ не работает, дублируются маршруты, сломан поиск - полное руководство по исправлению
Если вы открыли эту статью, скорее всего, в вашем магазине на OpenCart что-то пошло не так: ссылки выглядят как /index.php?route=product/category&path=25, поиск выдаёт пустую страницу, мета-теги сбрасываются после сохранения, или сайт упорно остаётся на английском. Всё это - классические проблемы с SEO URL и маршрутизацией, которые решаются за 15–30 минут, если знать где копать.
Статья подойдёт владельцам магазинов и разработчикам, работающим с OpenCart 2.x и 3.x.
Что такое SEO URL (ЧПУ) в OpenCart
ЧПУ - «человекопонятные URL» - это адреса вида /noutbuki/apple-macbook-air/ вместо /index.php?route=product/product&product_id=42. Они улучшают поведенческие факторы, повышают CTR в поиске и помогают поисковикам понять структуру сайта.
В OpenCart за ЧПУ отвечает связка из трёх компонентов:
настройка «SEO URL» в панели администратора;
файл .htaccess в корне сайта (для Apache) или конфиг nginx;
таблица oc_url_alias в базе данных, где хранятся псевдонимы страниц.
Если хотя бы одно звено сломано - ЧПУ не работает или работает с ошибками.
Почему возникают проблемы с SEO URL
Причин несколько, и они часто накладываются друг на друга:
Неправильный .htaccess - файл отсутствует, перезаписан хостингом или содержит конфликтующие директивы.
mod_rewrite отключён на сервере - без этого модуля Apache не умеет обрабатывать красивые ссылки.
Конфликты расширений - плагины SEO, фильтры, мультиязычные модули часто переопределяют маршруты и псевдонимы.
Кэш системы маршрутизации не сброшен после изменений.
Ошибки в базе данных - дубли в oc_url_alias или некорректные записи.
Частые ошибки и проблемы
1. ЧПУ включено в настройках, но URL не изменились
Самая распространённая ситуация. Галочка стоит, а ссылки всё равно index.php?route=....
2. Страницы открываются только без ЧПУ, с ЧПУ - 404
Это почти всегда проблема .htaccess или отсутствие mod_rewrite.
3. Два URL ведут на одну страницу (дубли)
Например, /catalog/noutbuki/ и /index.php?route=product/category&path=25 оба работают. Это убивает SEO.
4. Поиск выдаёт пустую страницу
После перехода на ЧПУ поисковая форма отправляет запрос не туда или маршрут search переопределён расширением.
5. Мета-теги сбрасываются
Вы сохраняете Title и Description в товаре, обновляете страницу - и они снова пустые. Проблема в конфликте нескольких SEO-модулей, которые перезаписывают друг друга.
6. Язык не переключается, остаётся английский
Типичен для мультиязычных магазинов. Маршрут языка не регистрируется, или языковой файл не подключается из-за неверного алиаса.
Пошаговое решение
Шаг 1. Включение SEO URL в OpenCart
Войдите в Система → Настройки → [ваш магазин] → вкладка «Сервер».
Найдите опцию «SEO URL» и установите значение «Да».
Нажмите «Сохранить».
Система → Настройки → Сервер → SEO URL → Да
Шаг 2. Настройка .htaccess
Скопируйте файл htaccess.txt из корня OpenCart и переименуйте в .htaccess:
cp htaccess.txt .htaccessСтандартное содержимое файла для OpenCart 3.x:
Options +FollowSymlinks
# Prevent Directoryisting
Options -Indexes
# Prevent hotlinking
#RewriteCond %{HTTP_REFERER} !^$
#RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?yourdomain.com [NC]
#RewriteRule \.(jpg|jpeg|png|gif)$ - [NC,F,L]
# SEO URL Settings
RewriteEngine On
RewriteBase /
# If your opencart installation does not run on the main web folder
# make sure you folder it does run in ie. / becomes /shop/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !.*\.(ico|gif|jpg|jpeg|png|js|css)
RewriteRule ^([^?]*) index.php?_route_=$1 [L,QSA]Важно: если сайт установлен в подпапку, например /shop/, замените RewriteBase / на RewriteBase /shop/.
Шаг 3. Проверка mod_rewrite на сервере
На Apache выполните в SSH:
apache2ctl -M | grep rewriteЕсли вывод пустой - модуль выключен. Включите его:
sudo a2enmod rewrite
sudo systemctl restart apache2Для nginx ЧПУ настраивается иначе - через try_files:
location / {
try_files $uri $uri/ /index.php?_route_=$uri&$args;
}Шаг 4. Исправление дублей маршрутов
Откройте phpMyAdmin и выполните запрос:
SELECT keyword, COUNT(*) as cnt
FROM oc_url_alias
GROUP BY keyword
HAVING cnt > 1;
Если есть дубли - удалите лишние записи:
DELETE FROM oc_url_alias
WHERE id NOT IN (
SELECT MIN(id) FROM oc_url_alias GROUP BY keyword
);После этого сбросьте кэш: Система → Кэш → Очистить.
Шаг 5. Исправление пустой страницы поиска
Откройте файл catalog/controller/product/search.php. Убедитесь, что маршрут не переопределяется сторонним расширением. Проверьте папку catalog/controller/extension/ - там не должно быть файла search.php от конфликтующего модуля.
Также проверьте таблицу маршрутов в БД:
SELECT * FROM oc_url_alias WHERE keyword = 'search';Если запись есть - удалите её (поиск не должен иметь алиаса по умолчанию):
DELETE FROM oc_url_alias WHERE keyword = 'search';Шаг 6. Исправление мета-тегов
Если мета-теги сбрасываются, скорее всего, установлено два и более SEO-модуля. Проверьте:
Расширения → Модули - найдите все SEO-плагины.
Оставьте один, остальные деактивируйте.
Проверьте хуки в system/engine/action.php - нет ли двойного вызова метода getTitle.
Если используете кастомный модуль, убедитесь, что метод записи мета-тегов не вызывается раньше стандартного контроллера:
// Неправильно: перезаписывает данные товара
public function index() {
$this->load->model('catalog/product');
$product_info = $this->model_catalog_product->getProduct($product_id);
$this->document->setTitle('Мой заголовок'); // перезапишет всё
}
// Правильно: проверяем, задан ли уже заголовок
if (!$this->document->getTitle()) {
$this->document->setTitle($product_info['meta_title']);
}Шаг 7. Исправление языка
Если язык не переключается:
Система → Настройки → Локализация - убедитесь, что нужный язык включён и задан корректный код (например, ru-ru).
Проверьте наличие языкового пакета:
catalog/language/ru-ru/
admin/language/ru-ru/В таблице oc_language проверьте запись:
SELECT * FROM oc_language WHERE code = 'ru-ru';Поле status должно быть 1.
Если используется мультиязычный SEO-модуль, проверьте алиасы в oc_url_alias - у страниц должны быть отдельные записи для каждого языка с корректным store_id и кодом языка.
Примеры реальных сценариев
Сценарий 1: После переезда на новый хостинг перестало работать ЧПУ
Хостинг использует nginx. Нужно добавить try_files в конфиг виртуального хоста. .htaccess при этом не применяется совсем.
Сценарий 2: Установили модуль фильтра товаров - сломался поиск
Модуль добавил свой контроллер search.php в catalog/controller/extension/module/. OpenCart подхватил его вместо стандартного. Решение: переименовать файл модуля или изменить роутинг в catalog/config/.
Сценарий 3: Переключение языка в URL работает, но контент остаётся на English
Проблема в языковом файле. Файл catalog/language/ru-ru/common/header.php отсутствует или поврежден. Нужно повторно загрузить языковой пакет.
Часто задаваемые вопросы (FAQ)
Q: Включил SEO URL, сайт выдаёт 404 на всех страницах. Что делать? A: Первым делом проверьте .htaccess - он должен быть в корне сайта, не в подпапке upload/. Убедитесь, что mod_rewrite включён и директива AllowOverride All стоит в конфиге сервера.
Q: Как проверить, что mod_rewrite включён без доступа к SSH? A: Создайте файл test.php с содержимым <?php phpinfo(); ?> в корне сайта и откройте его в браузере. В разделе apache2handler найдите mod_rewrite - если он в списке загруженных модулей, всё в порядке.
Q: Нужен ли .htaccess при использовании nginx? A: Нет. Nginx не читает .htaccess. Все правила нужно прописывать напрямую в конфигурационном файле виртуального хоста через try_files.
Q: После сброса кэша мета-теги снова пропали. Почему? A: Скорее всего, несколько расширений записывают мета-теги в одно и то же поле. Проверьте порядок загрузки модулей в Расширения → События и деактивируйте конфликтующие.
Q: Можно ли сделать ЧПУ без .htaccess, только через настройки OpenCart? A: Нет. SEO URL в OpenCart - это клиентская настройка для формирования ссылок. Без серверного правила перенаправления эти ссылки не будут обрабатываться корректно.
Q: Как добавить ЧПУ для нестандартной страницы (custom page)? A: Добавьте запись в таблицу oc_url_alias вручную:
INSERT INTO oc_url_alias (query, keyword)
VALUES ('information/information&information_id=5', 'o-kompanii');Q: Язык переключается в URL (/ru/), но в SEO URL он не отображается. Как исправить? A: Убедитесь, что используемый SEO-модуль поддерживает мультиязычность. В стандартном OpenCart 3 для этого используется catalog/controller/startup/language.php, который определяет язык по сессии и куки, а не по URL.
Q: Дубли страниц уже попали в индекс Google. Что делать? A: Добавьте canonical-теги или настройте 301-редирект с index.php?route=... на ЧПУ-версию. В OpenCart 3 canonical задаётся через $this->document->addLink($url, 'canonical') в контроллере.
Полезные советы и лучшие практики
Всегда делайте бэкап перед изменением .htaccess и таблиц базы данных.
Не устанавливайте несколько SEO-модулей одновременно - они практически всегда конфликтуют.
Проверяйте логи сервера (/var/log/apache2/error.log или аналогичные) при появлении 404/500 - там будет точная причина.
После любых изменений маршрутов сбрасывайте кэш через Система → Кэш → Очистить.
Используйте 301-редиректы при смене структуры URL - это сохранит SEO-вес страниц.
Для мультиязычных магазинов проверяйте каждый язык в отдельной вкладке инкогнито, чтобы исключить влияние куки.
Регулярно проверяйте дубли в oc_url_alias - особенно после массовой загрузки товаров или миграции.
Итог
Проблемы с SEO URL в OpenCart - одни из самых частых, но при системном подходе решаются быстро. Ключевые точки проверки: наличие и корректность .htaccess, активность mod_rewrite, отсутствие конфликтующих расширений и чистота таблицы oc_url_alias. Пустой поиск, сброс мета-тегов и сломанный язык в большинстве случаев указывают на конфликт модулей - именно туда стоит смотреть в первую очередь.
Комментарии
Чтобы оставить комментарий, войдите в аккаунт.