2012-05-30 3 views
25

У меня есть User SEO URL's, установленный в Yes в OpenCart Admin.Удалить index.php? Route = common/home из OpenCart

System -> Settings -> Store -> Server -> User SEO URL's

До сих пор все теги и SEO ссылки работают; команда сделала желаемый эффект.

Однако для главной страницы и нескольких других ссылок; как удалить:

index.php маршрут = общий/дом

С URL? Должен ли я буквально делать поиск и замену в файлах PHP с жестким кодом и повышать риск или есть другой способ?

(без вздутия производительности т.е. без каких-либо плохих инструментов любительских, таких как vQmod)

+0

Насколько я знаю, 100% -ный жесткий код. Хуже то, что OpenCart Enviroment запускается на Nginx, поэтому вам нужно написать много ручных функций, а также это не так просто, как найти и заменить этот/common/домой - гораздо больше функций вокруг себя! Отправлено .. как я тоже хочу ответить – AlphaApp

+0

Вы пытались удалить с помощью 'htaccess'? – Leri

+0

@PLB вы не можете сделать это, поскольку я использую Nginx и кроме этого .htaccess только перенаправляет или перезаписывает - вам все равно нужно удалить index.php? Route = в коде. – TheBlackBenzKid

ответ

26

Чтобы просто удалить, что вы можете сделать основную замену в /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); 

Кроме того, убедитесь SEO URL-адрес включена в панели администратора магазина.

+0

Так что удалите все 'index.php? Route =', по сути, это то, что необходимо. – TheBlackBenzKid

+0

Редактировать, я добавил еще одно решение выше. Спасибо за это. – TheBlackBenzKid

+3

То, что вы добавили, обязательно установит маршрут, однако это может иметь последствия. Например, во-первых, вам нужно преобразовать новый URL-адрес обратно в маршрут, когда вы ссылаетесь на него. Во-вторых, что происходит, если страница имеет другие параметры, а не только маршрут. Предположим, что вы используете страницу поиска, у вас будет 'product/search & page = 2 & query = something', что является недопустимым URL-адресом, поэтому я бы посоветовал вам отказаться от того, что у вас было выше –

3

Как насчет того, чтобы заменить ссылку в логотипе на <?php echo $base; ?>. Он сделает ссылку на базовый домен и удалит index.php?route=common/home.

+3

Он удалит это, но обязательно, но как насчет остальной части index.php? Route = common/home urls? –

+0

Это хороший момент. Мне это нравится и +1, но это не полное решение. Я никогда не знал о '$ base' – TheBlackBenzKid

+0

Неполное решение .. щелчок что-то в навигационной панели также идет в index.php? Blabla –

0

/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('&amp;', '&', $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; 
     }  
    } 
} 
?> 

---------------- - ГДЕ ИЗМЕНЕНИЕ -------------------------

Нижняя строка i добавлена ​​в индекс общественной функции() также Public Переписать функцию. Функция

else { 
this->request->get['route'] = $this->request->get['_route_']; 
} 

индекс() Выполняют как этот

  1. Получить запрос из htaccss (Ex: URL выглядеть site.com/shirts) "маршрут = $ 1?"
  2. так route is shirts
  3. В настоящее время функция проверки «рубашек» находится в таблице url_alias, если ее найдено, тогда ее можно сделать varable как index.php? categoryID = Значение из таблицы url_alias.
  4. Или, если в таблице url_alias для рубашек нет записи, тогда ее проверки показывают, что это некоторые другие страницы, такие как информация или производитель, если она обнаружила, что она делает переменную get. Example index.php? Route = информация/информация или индекс. PHP? маршрута = продукт/производитель/информация.
  5. Но его проверка не найдена в макетах. Поэтому я добавил код в еще блок, установить маршрут в переменную GET, как этот index.php? Маршруту = < маршрут>
  6. Таким образом, в индексе() функции его отлично работает. Как и я, я сделал это в функции перезаписи.
+0

не работает извините –

3

Решение Jay не работает для меня, после редактирования я получаю пустой экран. Так что я сделал новый:

Поместите линию перед:

return $link; 

Вместо после:

public function rewrite($link) { 
+0

Интересно. Какую версию ты используешь? – TheBlackBenzKid

+1

Я использую v1.5.5.1 сэр. – Vojta

+0

Спасибо. Оцените обратную связь – TheBlackBenzKid

3

Итак, я использую 1.5.5.1, ни один из ответов на этот вопрос решил мою проблему. Однако, объединив ответы от @Jay Gilford, @TheBlackBenzKid и @rkaartikeyen Я придумал полностью работающее решение.

Не забывайте вводить ссылки на seo, как показано на рисунке @TheBlackBenzKid.

Объяснение можно найти под кодом.

 
[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) { 
     $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/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]); 
       } 
      } 
     } 

     if ($url) { 
      unset($data['route']); 

      $query = ''; 

      if ($data) { 
       foreach ($data as $key => $value) { 
        $query .= '&' . $key . '=' . $value; 
       } 

       if ($query) { 
        $query = '?' . trim($query, '&'); 
       } 
      } 

      return $url_info['scheme'] . '://' . $url_info['host'] . (isset($url_info['port']) ? ':' . $url_info['port'] : '') . str_replace('/index.php', '', $url_info['path']) . $url . $query; 
     } else { 
      $link = str_replace('index.php?route=', '', $link); 
      return $link; 
     } 
    } 
} 

По-видимому, @Jay Gilford и @TheBlackBenzKid решить вопрос о URLs должным образом написано на этой странице.

 
Line 113 

$link = str_replace('index.php?route=', '', $link); 

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

 
Line 38 - 40 

} else { 
    $this->request->get['route'] = 'error/not_found'; 
} 

@rkaartikeyen's решения решает эту проблему путем установки текущего маршрута к запрашиваемому маршруту

 
Line 51 - 53 

else { 
    $this->request->get['route'] = $this->request->get['_route_']; 
} 
+0

Не работает для меня ... –

+0

Какая версия вы используете? Кроме того, я давно прекратил использовать OC. – frostymarvelous

7

предыдущего «решения» являются неправильными, потому что они нападают на SEO URL перевести. Вы хотите иметь дело с 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('&', '&amp;', '&' . ltrim($args, '&')); 
     } 
    } else { 
     $url .= 'index.php?route=' . $route; 
     if ($args) { 
      $url .= str_replace('&', '&amp;', '&' . ltrim($args, '&')); 
     } 
    } 

    foreach ($this->rewrite as $rewrite) { 
     $url = $rewrite->rewrite($url); 
    } 

    return $url; 
} 

Простой, как этот. Я не могу поверить, почему это не в ядре OpenCart.

EDIT:

Я несколько тестов, и если SEO URL-адреса включена, то необходимо сделать одну единственную редактировать в /catalog/controller/common/seo_url.php, чтобы избежать «Undefined индекс» ошибка.

Внутри public function rewrite, замените эту строку:

parse_str($url_info['query'], $data); 

С этим:

if (isset($url_info['query'])) parse_str($url_info['query'], $data); 

Теперь это действительно работает.

+2

Это будет работать с ИЛИ без URL-адресов SEO и будет содержать аргументы строки запроса –

+0

opencart 1.5.5.1.2 - Я вижу 'myshop/index.php? Route' в url –

+0

@VitalyZdanevich, какая версия OC это? Это официальный релиз? Вы уверены, что у вас появились URL-адреса SEO? Во всяком случае, я действительно рекомендую вам обновить, потому что такая старая версия больше не поддерживается и имеет множество проблем с безопасностью. –

8

Мне очень нравится решение Виктора Шредера выше, потому что это простота. Благодаря! Я создал 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('&', '&amp;', '&' . 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> 
0

В файле \ System \ Library \ response.php добавить следующую строку в начале выхода публичной функции()

if (!defined('HTTP_CATALOG')) $this->output = str_replace(array('index.php?route=common/home', '?route=common/home'), '', $this->output); 
1

я пришел поздно, но мое решение может быть полезным для других (проверено на OpenCart 2.0.3.1):

Откройте консоль MySQL и запустить этот запрос (изменение YOURDATABASE с вашим именем дб):

INSERT INTO `YOURDATABASE`.`url_alias` (`url_alias_id`, `query`, `keyword`) VALUES (NULL, 'common/home', ' '); 

Как это работает:

Хитрость заключается в добавлении белого пространства («„) для столбца „ключевое слово“, если вставить пустую строку (“») этот способ не работает и переписывающий URL снова вернется index.php? route = common/home.

+0

Работает в '1.5.5.1.2', но с пробелом в' keyword'. У меня есть '% 20' в конце моего URL-адреса при нажатии на логотип, поэтому я удалил пробел. –

-1

Чтобы удалить index.php?route= с URL-адресов, я просто рекомендую отредактировать файл .htaccess.

Просто добавьте это:

RewriteCond %{THE_REQUEST} \ /index\.php\?_route_=?([^&\ ]*) 
RewriteRule^/%1? [L,R] 

Я не столкнуться никаких проблем вообще. Просто помните, что вам нужно иметь RewriteEngine. Посмотрите на эту строку: RewriteEngine On. Если нет, пропустите его перед кодом выше.

+0

Это не удаляет его из файлов PHP, однако они жестко закодированы, чтобы иметь это внутри них. – TheBlackBenzKid

1

Шаг 01. Включить USE SEO URL, в настройках сервера хранения

Перейти к «системе» и нажмите на кнопку «Настройки». Найдите магазин, который хотите изменить, и нажмите ссылку «Изменить» справа. Наконец, перейдите на вкладку «Сервер» и установите радиоприемник URL-адреса «Да» и сохраните настройки.

Примечание: ключевые слова не будут созданы для вас автоматически. У вас также должен быть включен mod_rewrite Apache. Большинство веб-хостов будут иметь это по умолчанию. Шаг 3 этого руководства объяснит, как добавить ключевые слова.

Шаг 02. Измените содержимое в своем.htaccess, чтобы сделать вашу домашнюю страницу URL-адрес URL-адреса Friendly

Перейдите на панель управления хостом и отредактируйте файл .htaccess. Иногда этот файл скрыт, чтобы отобразить его, вы можете щелкнуть мышью на файловом менеджере панели управления веб-хоста и пометить опцию show hidden files, а затем кнопку «go».

После того, как вы найти файл .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] 

To:

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 вручную. Наконец, вам нужно ввести ключевые слова SEO для каждой страницы, информации, продукта и категории, в которой вы хотите переписать URL. Вы можете найти поле для ключевых слов SEO на вкладке «Данные» при редактировании и создании элементов.

Как только вы ввели ключевые слова SEO, ваш URL-адрес будет работать.

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

Смежные вопросы