Решил сделать эксперимент и поставить для генерации урлов seopack. Прикол в том, что все отлично работает и генерирует, только на страницы самого товара не входит) Выдает 404. Кто что может подсказать?
Файл .htaccess.txt переименован? Какой режим ЧПУ? Кеш чистил? На категорию или информационную странницу попадает? Какой сервер nginx или apache?
Файл .htaccess.txt конечно переименовывал. Тип ЧПУ - Seopro (Когда ставлю по умолчанию, все работает как нужно, но делает много дублей). Кеш - чистил. На категории заходит. На страницы информации - нет. Сервер - хз(
Seopro замени PHP: <?phpclass ControllerCommonSeoPro extends Controller {private $cache_data = null;private $languages = array();private $config_language; public function __construct($registry) {parent::__construct($registry);$this->cache_data = $this->cache->get('seo_pro');if (!$this->cache_data) {$query = $this->db->query("SELECT LOWER(`keyword`) as 'keyword', `query` FROM " . DB_PREFIX . "url_alias");$this->cache_data = array();foreach ($query->rows as $row) {$this->cache_data['keywords'][$row['keyword']] = $row['query'];$this->cache_data['queries'][$row['query']] = $row['keyword'];}$this->cache->set('seo_pro', $this->cache_data);} $query = $this->db->query("SELECT `value` FROM `" . DB_PREFIX . "setting` WHERE `key` = 'config_language'");$this->config_language = $query->row['value']; $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "language WHERE status = '1'"); foreach ($query->rows as $result) {$this->languages[$result['code']] = $result;} } public function index() { // language$code = $this->config_language; if(isset($this->request->get['_route_'])) {$tokens = explode('/', $this->request->get['_route_']); if(array_key_exists($tokens[0], $this->languages)) {$code = $tokens[0];$this->request->get['_route_'] = substr($this->request->get['_route_'], strlen($code) + 1);} if(trim($this->request->get['_route_']) == '' || trim($this->request->get['_route_']) == 'index.php') {unset($this->request->get['_route_']);}} if(!isset($this->session->data['language']) || $this->session->data['language'] != $code) {$this->session->data['language'] = $code;} if(!isset($this->request->cookie['language']) || $this->request->cookie['language'] != $code) {setcookie('language', $code, time() + 60 * 60 * 24 * 30, '/', $this->request->server['HTTP_HOST']);} $this->config->set('config_language_id', $this->languages[$code]['language_id']);$this->config->set('config_language', $this->languages[$code]['code']); $language = new Language($this->languages[$code]['directory']);$language->load($this->languages[$code]['filename']);$this->registry->set('language', $language); // Add rewrite to url classif ($this->config->get('config_seo_url')) {$this->url->addRewrite($this);} else {return;} // Decode URLif (!isset($this->request->get['_route_'])) {$this->validate();} else {$route = $this->request->get['_route_'];unset($this->request->get['_route_']);$parts = explode('/', trim(utf8_strtolower($route), '/'));list($last_part) = explode('.', array_pop($parts));array_push($parts, $last_part); $rows = array();foreach ($parts as $keyword) {if (isset($this->cache_data['keywords'][$keyword])) {$rows[] = array('keyword' => $keyword, 'query' => $this->cache_data['keywords'][$keyword]);}} if (count($rows) == sizeof($parts)) {$queries = array();foreach ($rows as $row) {$queries[utf8_strtolower($row['keyword'])] = $row['query'];} reset($parts);foreach ($parts as $part) {$url = explode('=', $queries[$part], 2); if ($url[0] == 'category_id') {if (!isset($this->request->get['path'])) {$this->request->get['path'] = $url[1];} else {$this->request->get['path'] .= '_' . $url[1];}} elseif (count($url) > 1) {$this->request->get[$url[0]] = $url[1];}}} else {$this->request->get['route'] = 'error/not_found';} if (isset($this->request->get['product_id'])) {$this->request->get['route'] = 'product/product';if (!isset($this->request->get['path'])) {$path = $this->getPathByProduct($this->request->get['product_id']);if ($path) $this->request->get['path'] = $path;}} 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/product';} elseif (isset($this->request->get['information_id'])) {$this->request->get['route'] = 'information/information';} else {if (isset($queries[$parts[0]])) {$this->request->get['route'] = $queries[$parts[0]];}} $this->validate(); if (isset($this->request->get['route'])) {return $this->forward($this->request->get['route']);}}} public function rewrite($link, $code = '') {if(!$code) {$code = $this->session->data['language'];}if (!$this->config->get('config_seo_url')) return $link; $seo_url = ''; $component = parse_url(str_replace('&', '&', $link)); $data = array();parse_str($component['query'], $data); $route = $data['route'];unset($data['route']); switch ($route) {case 'product/product':if (isset($data['product_id'])) {$tmp = $data;$data = array();if ($this->config->get('config_seo_url_include_path')) {$data['path'] = $this->getPathByProduct($tmp['product_id']);if (!$data['path']) return $link;}$data['product_id'] = $tmp['product_id'];if (isset($tmp['tracking'])) {$data['tracking'] = $tmp['tracking'];}}break; case 'product/category':if (isset($data['path'])) {$category = explode('_', $data['path']);$category = end($category);$data['path'] = $this->getPathByCategory($category);if (!$data['path']) return $link;}break; case 'product/product/review':case 'information/information/info':return $link;break; default:break;} if ($component['scheme'] == 'https') {$link = $this->config->get('config_ssl');} else {$link = $this->config->get('config_url');} if ($code != $this->config_language){$link .= $code . '/index.php?route=' . $route;} else{$link .= 'index.php?route=' . $route;} if (count($data)) {$link .= '&' . urldecode(http_build_query($data, '', '&'));} $queries = array();foreach ($data as $key => $value) {switch ($key) {case 'product_id':case 'manufacturer_id':case 'category_id':case 'information_id':$queries[] = $key . '=' . $value;unset($data[$key]);$postfix = 1;break; case 'path':$categories = explode('_', $value);foreach ($categories as $category) {$queries[] = 'category_id=' . $category;}unset($data[$key]);break; default:break;}} if(empty($queries)) {$queries[] = $route;} $rows = array();foreach($queries as $query) {if(isset($this->cache_data['queries'][$query])) {$rows[] = array('query' => $query, 'keyword' => $this->cache_data['queries'][$query]);}} if(count($rows) == count($queries)) {$aliases = array();foreach($rows as $row) {$aliases[$row['query']] = $row['keyword'];}foreach($queries as $query) {$seo_url .= '/' . rawurlencode($aliases[$query]);}} if ($seo_url == '') return $link; if($code != $this->config_language) {$seo_url = $code . '/' . trim($seo_url, '/');} else {$seo_url = trim($seo_url, '/');} if ($component['scheme'] == 'https') {$seo_url = $this->config->get('config_ssl') . $seo_url;} else {$seo_url = $this->config->get('config_url') . $seo_url;} if (isset($postfix)) {$seo_url .= trim($this->config->get('config_seo_url_postfix'));} else {$seo_url .= '/';}$seo_url = trim($seo_url, '//');if($route == 'common/home') {$seo_url .= '/';} if (count($data)) {$seo_url .= '?' . urldecode(http_build_query($data, '', '&'));} return $seo_url;} private function getPathByProduct($product_id) {$product_id = (int)$product_id;if ($product_id < 1) return false; static $path = null;if (!is_array($path)) {$path = $this->cache->get('product.seopath');if (!is_array($path)) $path = array();} if (!isset($path[$product_id])) {$query = $this->db->query("SELECT category_id FROM " . DB_PREFIX . "product_to_category WHERE product_id = '" . $product_id . "' ORDER BY main_category DESC LIMIT 1"); $path[$product_id] = $this->getPathByCategory($query->num_rows ? (int)$query->row['category_id'] : 0); $this->cache->set('product.seopath', $path);} return $path[$product_id];} private function getPathByCategory($category_id) {$category_id = (int)$category_id;if ($category_id < 1) return false; static $path = null;if (!is_array($path)) {$path = $this->cache->get('category.seopath');if (!is_array($path)) $path = array();} if (!isset($path[$category_id])) {$max_level = 10; $sql = "SELECT CONCAT_WS('_'";for ($i = $max_level-1; $i >= 0; --$i) {$sql .= ",t$i.category_id";}$sql .= ") AS path FROM " . DB_PREFIX . "category t0";for ($i = 1; $i < $max_level; ++$i) {$sql .= " LEFT JOIN " . DB_PREFIX . "category t$i ON (t$i.category_id = t" . ($i-1) . ".parent_id)";}$sql .= " WHERE t0.category_id = '" . $category_id . "'"; $query = $this->db->query($sql); $path[$category_id] = $query->num_rows ? $query->row['path'] : false; $this->cache->set('category.seopath', $path);} return $path[$category_id];} private function validate() {if (isset($this->request->get['route']) && $this->request->get['route'] == 'error/not_found') {return;}if(empty($this->request->get['route'])) {$this->request->get['route'] = 'common/home';} if (isset($this->request->server['HTTP_X_REQUESTED_WITH']) && strtolower($this->request->server['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {return;} if (isset($this->request->server['HTTPS']) && (($this->request->server['HTTPS'] == 'on') || ($this->request->server['HTTPS'] == '1'))) {$url = str_replace('&', '&', $this->config->get('config_ssl') . ltrim($this->request->server['REQUEST_URI'], '/'));$seo = str_replace('&', '&', $this->url->link($this->request->get['route'], $this->getQueryString(array('route')), 'SSL'));} else {$url = str_replace('&', '&', $this->config->get('config_url') . ltrim($this->request->server['REQUEST_URI'], '/'));$seo = str_replace('&', '&', $this->url->link($this->request->get['route'], $this->getQueryString(array('route')), 'NONSSL'));} if (rawurldecode($url) != rawurldecode($seo)) { header($this->request->server['SERVER_PROTOCOL'] . ' 301 Moved Permanently'); $this->response->redirect($seo);}} private function getQueryString($exclude = array()) {if (!is_array($exclude)) {$exclude = array();} return urldecode(http_build_query(array_diff_key($this->request->get, array_flip($exclude))));}}?>
И так, тему можно закрывать, разобрался) Проблема крылась в том, что Seopro не обрабатывал черточки и любые знаки. Сделал вот че: Зашел в файл catalog/controller/common/seo_pro.php Примерно 34-36 строки: PHP: list($last_part) = explode('.', array_pop($parts));array_push($parts, $last_part); Комментируем их и все будет тип топ!