Удалить index.php? Route=common/home из OpenCart
У меня сейчас User SEO URL's
установите Да в OpenCart Admin.
System -> Settings -> Store -> Server -> User SEO URL's
Пока все теги и SEO-ссылки работают; Команда сделала желаемый эффект.
Однако для домашней страницы и нескольких других ссылок; как мне удалить:
index.php? маршрута = общий / дом
С URL? Нужно ли буквально выполнять поиск и замену в PHP-файлах жесткого кода и рисковать обновлениями, или есть другой способ?
(без вздутия производительности, то есть без плохих любительских инструментов, таких как vQmod)
16 ответов
Чтобы просто удалить это, вы можете сделать базовую замену в /catalog/controller/common/seo_url.php
Найти:
return $link;
Перед этим на новой строке поставьте:
$link = str_replace('index.php?route=common/home', '', $link);
Редактирование: TheBlackBenzKid: Если вы хотите полноценный SEO, просто используйте эту строку вместо вышеуказанной:
$link = str_replace('index.php?route=', '', $link);
Также убедитесь, что URL-адреса SEO включены в панели администратора магазина.
Мне очень нравится приведенное выше решение Виктора Шредера за его простоту. Спасибо! Я создал vQmod на основе его кодовых модов на случай, если он кому-нибудь пригодится. вот код:
<modification>
<file name="system/library/url.php">
<operation>
<search position="before"><![CDATA[$url .= 'index.php?route=' . $route;]]></search>
<add><![CDATA[
if ('common/home' == $route) {
if ($args) {
$url .= '?' . str_replace('&', '&', '&' . ltrim($args, '&'));
}
} else {
]]></add>
</operation>
<operation>
<search position="before"><![CDATA[foreach ($this->rewrite as $rewrite) {]]></search>
<add><![CDATA[
}
]]></add>
</operation>
</file>
<file name="catalog/controller/common/seo_url.php">
<operation>
<search position="replace"><![CDATA[parse_str($url_info['query'], $data);]]></search>
<add><![CDATA[
if (isset($url_info['query'])) parse_str($url_info['query'], $data);
]]></add>
</operation>
</file>
</modification>
Предыдущие "решения" ошибочны, потому что они нападают на перевод URL SEO. Вам нужно иметь дело с генерацией URL внутри OpenCart.
Давайте будем простыми. Идти к /system/library/url.php
и посмотрите на public function link
, Замените функцию этой версией:
public function link($route, $args = '', $connection = 'NONSSL') {
if ('NONSSL' == $connection) {
$url = $this->url;
} else {
$url = $this->ssl;
}
if ('common/home' == $route) {
if ($args) {
$url .= '?' . str_replace('&', '&', '&' . ltrim($args, '&'));
}
} else {
$url .= 'index.php?route=' . $route;
if ($args) {
$url .= str_replace('&', '&', '&' . ltrim($args, '&'));
}
}
foreach ($this->rewrite as $rewrite) {
$url = $rewrite->rewrite($url);
}
return $url;
}
Просто так. Я не могу поверить, почему это не в ядре OpenCart.
РЕДАКТИРОВАТЬ:
Я запускаю несколько тестов, и если URL-адреса SEO включены, необходимо выполнить одно редактирование в /catalog/controller/common/seo_url.php
чтобы избежать ошибки "Неопределенный индекс".
внутри public function rewrite
замените эту строку:
parse_str($url_info['query'], $data);
С этим:
if (isset($url_info['query'])) parse_str($url_info['query'], $data);
Теперь это действительно работает.
Итак, я использую 1.5.5.1, и ни один ответ на этот вопрос не решил мою проблему. Однако, комбинируя ответы Jay Gilford, TheBlackBenzKid и rkaartikeyan, я rkaartikeyan полностью работающее решение.
Не забудьте включить seo URL, как показано TheBlackBenzKid.
Объяснение можно найти под кодом.
[php] class ControllerCommonSeoUrl расширяет Controller { public function index() { // Добавить переписать в URL-класс if ($this->config->get('config_seo_url')) { $this->url->addRewrite($this); } // Декодировать URL if (isset($this->request->get['_route_'])) { $parts = explode('/', $this->request->get['_route_']); foreach ($parts as $part) { $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE keyword = '" . $this->db->escape($part) . "'"); if ($query->num_rows) { $url = explode('=', $query->row['query']); if ($url[0] == 'product_id') { $this->request->get['product_id'] = $url[1]; } if ($url[0] == 'category_id') { if (!isset($this->request->get['path'])) { $this->request->get['path'] = $ URL [1]; } else { $this->request->get['path'] .= '_' . $ URL [1]; } } if ($url[0] == 'factory_id') {$ this-> request-> get ['factory_id'] = $url[1]; } if ($url[0] == 'information_id') { $this->request->get['information_id'] = $url[1]; } } else { $this->request->get['route'] = 'error/not_found'; } } if (isset($this->request->get['product_id'])) { $this->request->get['route'] = 'product/product'; } elseif (isset($this->request->get['path'])) { $this->request->get['route'] = 'product/category'; } elseif (isset($this->request->get['factory_id'])) {$ this-> request-> get ['route'] = 'product / производитель /info'; } elseif (isset($this->request->get['information_id'])) { $this->request->get['route'] = 'information/information'; }else { $this->request->get['route'] = $this->request->get['_route_']; } if (isset($this->request->get['route'])) { return $this->forward($this->request->get['route']); } } } открытая функция перезаписи ($link) { $url_info = parse_url(str_replace('&', '&', $link)); $url = ''; $data = array(); parse_str($url_info['query'], $data); foreach ($data as $key => $value) { if (isset($data['route'])) { if (($data['route'] == 'product/product' && $key == 'product_id') || (($data['route'] == 'product/ производитель /info' || $data['route'] == 'product/product') && $key == ' factory_id') || ($data['route'] == 'информация / информация' && $key == 'information_id')) { $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE `query` = '" . $this->db->escape($key . '=' . (int)$value) . "'"); if ($query->num_rows) { $url .= '/' . $ Query-> строка [ 'ключевое слово']; переменные не установлены ($ данные [$ ключ]); } } elseif ($key == 'path') { $ Categories = взорваться ('_', $value); foreach ($category как $category) { $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE" query` = 'category_id = ". (int) $ category."' "); if ($ query-> num_rows) {$ url. = '/'. $ Query-> строка [ 'ключевое слово']; } } unset($data[$key]); } } } if ($url) { unset($data['route']); $query = ''; if ($data) { foreach ($data как $key => $value) { $query .= '&' . $ ключ. знак равно $ Значение; } if ($query) { $query = '?', trim($query, '&'); } } вернуть $ url_info ['схема'] . '://' . $url_info['host'] . (isset($url_info['port'])? ':' . $url_info['port']: '') . str_replace('/index.php', '', $url_info['path']) . $url . $ Запроса; } else { $link = str_replace('index.php?route=', '', $link); вернуть $ ссылку; }}}
По-видимому, Jay Gilford и TheBlackBenzKid решают проблему правильного написания URL-адресов на странице.
Линия 113 $link = str_replace('index.php?route=', '', $link);
Но кажется, что это нарушает URL, поскольку Контроллер не может найти страницы и поэтому возвращается к странице ошибки.
Линия 38 - 40 } еще { $ this-> request-> get ['route'] = 'error / not_found'; }
rkaartikeyan решает эту проблему, устанавливая текущий маршрут на запрашиваемый маршрут.
Линия 51 - 53 еще { $ this-> request-> get ['route'] = $ this-> request-> get ['_ route_']; }
Решение Джея не работает для меня, после редактирования я получаю пустой экран. Итак, я сделал новый:
Поместите строку перед:
return $link;
Вместо после:
public function rewrite($link) {
Шаг 01. Включите ИСПОЛЬЗОВАТЬ SEO URL в настройках сервера вашего магазина
Зайдите в "Система" и нажмите "Настройки". Найдите магазин, который вы хотите изменить, и нажмите ссылку "Изменить" справа. Наконец, перейдите на вкладку "Сервер" и установите для радио-адреса SEO значение "Да" и сохраните настройки.
Примечание. Ключевые слова не будут созданы для вас автоматически. Вы также должны включить Apache mod_rewrite. Большинство веб-хостов будут иметь это по умолчанию. Шаг 3 этого урока объяснит, как добавить ключевые слова.
Шаг 02. Измените некоторый контент в вашем файле.htaccess, чтобы сделать вашу домашнюю страницу оптимизированной для URL.
Перейдите на панель управления хостом и отредактируйте файл.htaccess. Иногда этот файл скрыт, чтобы отобразить его, вы можете щелкнуть на файловом менеджере панели управления веб-хостинга и установить флажок "Показать скрытые файлы", а затем кнопку "Перейти".
Как только вы найдете файл.htaccess, измените следующие строки:
RewriteBase /
RewriteRule ^sitemap.xml$ index.php?route=feed/google_sitemap [L]
RewriteRule ^googlebase.xml$ index.php?route=feed/google_base [L]
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]
Для того, чтобы:
RewriteBase /
RewriteRule ^sitemap.xml$ index.php?route=feed/google_sitemap [L]
RewriteRule ^googlebase.xml$ index.php?route=feed/google_base [L]
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]
RewriteCond %{QUERY_STRING} ^route=common/home$
RewriteRule ^index\.php$ http://www.yourwebsite.co.uk? [R=301,L]
Если вы сделаете шаг выше, ваша домашняя страница изменится примерно так: http://yourwebsite.com/index.php?route=common/home на это: http://yourwebsite.com/
Шаг 03. Введите ключевые слова SEO для URL-адресов вручную. Наконец, вам нужно ввести ключевые слова SEO для каждой страницы, информации, продукта и категории, для которой вы хотите перезаписать URL-адрес. Вы можете найти поле для ключевых слов SEO на вкладке Данные при редактировании и создании элементов.
После того, как вы ввели ключевые слова SEO, ваши URL будут работать.
Выполнив все эти инструкции, вы можете начать пользоваться преимуществами более высокого рейтинга, увеличения трафика и увеличения количества клиентов.
Как насчет замены ссылки в логотипе на <?php echo $base; ?>
, Сделает ссылку на базовый домен и удалит index.php?route=common/home
,
Для меня самый простой способ сделать это:
1- Перейти к /system/library/url.php
2- Найдите function link(
3- вверху return $url;
поместите следующую строку:
$url = str_replace('index.php?route=common/home', '', $url);
OpenCart 3.x
Прежде всего, в корневой папке вашего сайта переименуйте htaccess.txt в .htaccess.
Затем перейдите в Система> Настройки> Ваш магазин. Редактировать. Откройте вкладку Сервер и установите для параметра Использовать URL-адреса SEO значение Да.
Теперь откройте каталог / controller / startup / seo_url.php
найти } elseif ($key == 'path') {
Добавить перед
} elseif ($key == 'route') {
$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "seo_url WHERE `query` = '" . $this->db->escape($value) . "' AND store_id = '" . (int)$this->config->get('config_store_id') . "' AND language_id = '" . (int)$this->config->get('config_language_id') . "'");
if ($query->num_rows && $query->row['keyword']) {
$url .= '/' . $query->row['keyword'];
unset($data[$key]);
} else if ($data['route'] == "common/home") {
$url .= '/';
}
Сейчас же /index.php?route=common/home
стал /
И теперь вы можете установить URL-адреса SEO в разделе Дизайн> URL-адрес SEO, используя такие конструкции, как учетная запись / логин или информация / контакт.
Я опоздал, но мое решение может быть полезно для других (проверено на Opencart 2.0.3.1):
Откройте консоль MySQL и выполните этот запрос (измените YOURDATABASE на свое имя базы данных):
INSERT INTO `YOURDATABASE`.`url_alias` (`url_alias_id`, `query`, `keyword`) VALUES (NULL, 'common/home', ' ');
Как это устроено:
Хитрость заключается в добавлении WHITE SPACE (' ') для столбца "ключевое слово", если вы вставите пустую строку (''), этот обходной путь не сработает и перезаписывающий URL-адрес вернется снова index.php? Route=common/ Главная.
В Opencart 3, если вы хотите перенаправить все уродливые URL-адреса, например
index.php?route=common/home
index.php?route=account/register
index.php?route=product/product&path=244&product_id=481
Вам нужно добавить свои красивые URL-адреса в
Admin -> Design -> SEO Urls
похожий на
затем сделайте это: В
catalog/controller/startup/seo_url.php
, в функции
index
, после
if ($this->config->get('config_seo_url')) {
$this->url->addRewrite($this);
}
Добавь это
if (isset($this->request->get['route'])) {
if (DOMAIN_ROOT . $this->request->server['REQUEST_URI'] != $this->rewrite(DOMAIN_ROOT . $this->request->server['REQUEST_URI'])) {
$this->response->redirect($this->rewrite(DOMAIN_ROOT . $this->request->server['REQUEST_URI']));
}
}
elseif (strpos($this->request->server['REQUEST_URI'], 'index') !== false) {
$this->response->redirect(HTTPS_SERVER);
}
Добавьте последний шаг, чтобы определить
DOMAIN_ROOT
в
config.php
с участием
define('DOMAIN_ROOT', 'https://www.somedomain.org'); // no slash, no subfolder
Это очень хорошо работает для меня
В файле \system\library\response.php добавьте следующую строку в начало вывода публичной функции ()
if (!defined('HTTP_CATALOG')) $this->output = str_replace(array('index.php?route=common/home', '?route=common/home'), '', $this->output);
Я получил это http://www.antropy.co.uk/index.php/blog/one-quick-opencart-seo-tip-to-avoid-a-duplicate-home-page/ работал для меня, чтобы удалить код для моей домашней страницы
/catalog/controller/common/seo_url.php
Откройте файл и замените приведенный ниже код
<?php
class ControllerCommonSeoUrl extends Controller {
public function index() {
// Add rewrite to url class
if ($this->config->get('config_seo_url')) {
$this->url->addRewrite($this);
}
// Decode URL
if (isset($this->request->get['_route_'])) {
$parts = explode('/', $this->request->get['_route_']);
foreach ($parts as $part) {
$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE keyword = '" . $this->db->escape($part) . "'");
if ($query->num_rows) {
$url = explode('=', $query->row['query']);
if ($url[0] == 'product_id') {
$this->request->get['product_id'] = $url[1];
}
if ($url[0] == 'category_id') {
if (!isset($this->request->get['path'])) {
$this->request->get['path'] = $url[1];
} else {
$this->request->get['path'] .= '_' . $url[1];
}
}
if ($url[0] == 'manufacturer_id') {
$this->request->get['manufacturer_id'] = $url[1];
}
if ($url[0] == 'information_id') {
$this->request->get['information_id'] = $url[1];
}
} else {
$this->request->get['route'] = 'error/not_found';
}
}
if (isset($this->request->get['product_id'])) {
$this->request->get['route'] = 'product/product';
} elseif (isset($this->request->get['path'])) {
$this->request->get['route'] = 'product/category';
} elseif (isset($this->request->get['manufacturer_id'])) {
$this->request->get['route'] = 'product/manufacturer/info';
} elseif (isset($this->request->get['information_id'])) {
$this->request->get['route'] = 'information/information';
}else {
$this->request->get['route'] = $this->request->get['_route_'];
}
if (isset($this->request->get['route'])) {
return $this->forward($this->request->get['route']);
}
}
}
public function rewrite($link) {
if ($this->config->get('config_seo_url')) {
$url_data = parse_url(str_replace('&', '&', $link));
$url = '';
$data = array();
parse_str($url_data['query'], $data);
foreach ($data as $key => $value) {
if (isset($data['route'])) {
if (($data['route'] == 'product/product' && $key == 'product_id') || (($data['route'] == 'product/manufacturer/info' || $data['route'] == 'product/product') && $key == 'manufacturer_id') || ($data['route'] == 'information/information' && $key == 'information_id')) {
$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE `query` = '" . $this->db->escape($key . '=' . (int)$value) . "'");
if ($query->num_rows) {
$url .= '/' . $query->row['keyword'];
unset($data[$key]);
}
} elseif ($key == 'path') {
$categories = explode('_', $value);
foreach ($categories as $category) {
$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE `query` = 'category_id=" . (int)$category . "'");
if ($query->num_rows) {
$url .= '/' . $query->row['keyword'];
}
}
unset($data[$key]);
}else {
$url .= '/'.$value;
}
}
}
if ($url) {
unset($data['route']);
$query = '';
if ($data) {
foreach ($data as $key => $value) {
$query .= '&' . $key . '=' . $value;
}
if ($query) {
$query = '?' . trim($query, '&');
}
}
return $url_data['scheme'] . '://' . $url_data['host'] . (isset($url_data['port']) ? ':' . $url_data['port'] : '') . str_replace('/index.php', '', $url_data['path']) . $url . $query;
} else {
return $link;
}
} else {
return $link;
}
}
}
?>
------------------ ГДЕ ИЗМЕНЕНИЕ -------------------------
В строке ниже я добавил в Public Function index() также переписать Public Function.
else {
this->request->get['route'] = $this->request->get['_route_'];
}
Функция index () Выполните так
- Получите запрос от htaccss "? Route= $ 1" (например, URL выглядит как site.com/shirts)
- так что маршрут это рубашки
- теперь функция проверки "рубашки" найдена в таблице url_alias, если она найдена, то она делает переменную get, например, index.php?categoryID= значение из таблицы url_alias.
- Или же, если в таблице url_alias нет записи для рубашек, то она проверяет, есть ли другие страницы, такие как информация или производитель, если обнаружила, что она создает переменную get. Пример index.php? Route=information/information или index.php? Route= продукт / производитель / информация.
- Но это не проверка, это найдено в Макетах. Поэтому я добавил код в блок else, который устанавливает маршрут в переменную get, например, index.php? Route= < route >
- Так что в index () функции работают нормально. Как и я сделал в функции переписать.
Удалять index.php?route=
из URL просто рекомендую отредактировать .htaccess
файл.
Просто добавьте это:
RewriteCond %{THE_REQUEST} \ /index\.php\?_route_=?([^&\ ]*)
RewriteRule ^ /%1? [L,R]
У меня нет проблем вообще. Просто помните, что вам нужно включить RewriteEngine. Посмотрите на эту строку: RewriteEngine On
, Если нет, пройдите его перед кодом выше.
Я создал VQMOD для этого. Бесплатно скачать здесь: http://www.opencart.com/index.php?route=extension/extension/info&extension_id=14683
Работает хорошо.