URL-адрес Rewriting OpenCart Продукты SEO

Я бы хотел, чтобы переписать мой URL-адрес моего продукта в моем интернет-магазине opencart. У Opencart есть реализация seo, которая действительно отстой. Я обновил реализацию seo, чтобы иметь возможность использовать одно и то же ключевое слово для нескольких категорий. См. Ключевые слова для дублирования URL-адреса Openencart. Но это работает только для категорий. Думаю, для продуктов мне просто нужно правило перезаписи htaccess.

Оригинальный url выглядит так:

http://domain.com/index.php?route=product/product&path=25_28_93&product_id=1759

мой url выглядит так:

http://domain.com/In-Stock/Retreaded-Tires/Agricultural?product_id=1759

Как вы можете видеть, категории уже изменились.

И я хочу, чтобы это было так:

http://domain.com/In-Stock/Retreaded-Tires/Agricultural/1759/1050-50R32-Mega-X-Bib

Затем для разбивки на страницы (внутри категории) у меня есть этот URL:

http://domain.com/index.php?route=product/category&path=36_70_67&page=2

Я уже сделал это:

http://domain.com/Tire-Retreading/Equalizing/&page=2

Но я бы хотел, чтобы это было

http://domain.com/Tire-Retreading/Equalizing/2

Мой файл htaccess выглядит так:

 Options +FollowSymlinks Options -Indexes <FilesMatch "(?i)((\.tpl|\.ini|\.log|(?<!robots)\.txt))"> Order deny,allow Deny from all </FilesMatch> RewriteEngine On RewriteBase / RewriteRule ^sitemap.xml$ index.php?route=feed/google_sitemap [L] RewriteRule ^googlebase.xml$ index.php?route=feed/google_base [L] RewriteRule ^download/(.*) /index.php?route=error/not_found [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] 

Мой файл seo_url.php, который немного изменен, выглядит следующим образом:

 public function index() { $this->load->model('catalog/category'); // 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_']); // remove any empty arrays from trailing if (utf8_strlen(end($parts)) == 0) { array_pop($parts); } $categories = array(); for ($i = 0; $i < count($parts); $i++) { $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE keyword = '" . $this->db->escape($parts[$i]) . "'"); 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') { $categories[$i] = $this->model_catalog_category->getCategory($url[1]); if (!isset($this->request->get['path'])) { $this->request->get['path'] = $categories[$i]['category_id']; } else { foreach ($query->rows as $row) { $url = explode('=', $row['query']); $category_id = $url[1]; $category = $this->model_catalog_category->getCategory($category_id); if ($category['parent_id'] == $categories[$i - 1]['category_id']) { $this->request->get['path'] .= '_' . $category['category_id']; } } } } if ($url[0] == 'manufacturer_id') { $this->request->get['manufacturer_id'] = $url[1]; } if ($url[0] == 'information_id') { $this->request->get['information_id'] = $url[1]; } if ($query->row['query'] && $url[0] != 'information_id' && $url[0] != 'manufacturer_id' && $url[0] != 'category_id' && $url[0] != 'product_id') { $this->request->get['route'] = $query->row['query']; } } else { $this->request->get['route'] = 'error/not_found'; break; } } if (!isset($this->request->get['route'])) { 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'; } } if (isset($this->request->get['route'])) { return new Action($this->request->get['route']); } } } public function rewrite($link) { $url_info = parse_url(str_replace('&amp;', '&', $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 && $query->row['keyword']) { $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 && $query->row['keyword']) { $url .= '/' . $query->row['keyword']; } else { $url = ''; break; } } unset($data[$key]); } else { $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE `query` = '" .$data['route'] . "'"); if ($query->num_rows && $query->row['keyword']) { $url .= '/' . $query->row['keyword']; unset($data[$key]); } } } } if ($url) { unset($data['route']); $query = ''; if ($data) { foreach ($data as $key => $value) { $query .= '&' . rawurlencode((string)$key) . '=' . rawurlencode((string)$value); } if ($query) { $query = '?' . str_replace('&', '&amp;', 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 { return $link; } } не public function index() { $this->load->model('catalog/category'); // 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_']); // remove any empty arrays from trailing if (utf8_strlen(end($parts)) == 0) { array_pop($parts); } $categories = array(); for ($i = 0; $i < count($parts); $i++) { $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE keyword = '" . $this->db->escape($parts[$i]) . "'"); 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') { $categories[$i] = $this->model_catalog_category->getCategory($url[1]); if (!isset($this->request->get['path'])) { $this->request->get['path'] = $categories[$i]['category_id']; } else { foreach ($query->rows as $row) { $url = explode('=', $row['query']); $category_id = $url[1]; $category = $this->model_catalog_category->getCategory($category_id); if ($category['parent_id'] == $categories[$i - 1]['category_id']) { $this->request->get['path'] .= '_' . $category['category_id']; } } } } if ($url[0] == 'manufacturer_id') { $this->request->get['manufacturer_id'] = $url[1]; } if ($url[0] == 'information_id') { $this->request->get['information_id'] = $url[1]; } if ($query->row['query'] && $url[0] != 'information_id' && $url[0] != 'manufacturer_id' && $url[0] != 'category_id' && $url[0] != 'product_id') { $this->request->get['route'] = $query->row['query']; } } else { $this->request->get['route'] = 'error/not_found'; break; } } if (!isset($this->request->get['route'])) { 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'; } } if (isset($this->request->get['route'])) { return new Action($this->request->get['route']); } } } public function rewrite($link) { $url_info = parse_url(str_replace('&amp;', '&', $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 && $query->row['keyword']) { $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 && $query->row['keyword']) { $url .= '/' . $query->row['keyword']; } else { $url = ''; break; } } unset($data[$key]); } else { $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE `query` = '" .$data['route'] . "'"); if ($query->num_rows && $query->row['keyword']) { $url .= '/' . $query->row['keyword']; unset($data[$key]); } } } } if ($url) { unset($data['route']); $query = ''; if ($data) { foreach ($data as $key => $value) { $query .= '&' . rawurlencode((string)$key) . '=' . rawurlencode((string)$value); } if ($query) { $query = '?' . str_replace('&', '&amp;', 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 { return $link; } } не public function index() { $this->load->model('catalog/category'); // 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_']); // remove any empty arrays from trailing if (utf8_strlen(end($parts)) == 0) { array_pop($parts); } $categories = array(); for ($i = 0; $i < count($parts); $i++) { $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE keyword = '" . $this->db->escape($parts[$i]) . "'"); 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') { $categories[$i] = $this->model_catalog_category->getCategory($url[1]); if (!isset($this->request->get['path'])) { $this->request->get['path'] = $categories[$i]['category_id']; } else { foreach ($query->rows as $row) { $url = explode('=', $row['query']); $category_id = $url[1]; $category = $this->model_catalog_category->getCategory($category_id); if ($category['parent_id'] == $categories[$i - 1]['category_id']) { $this->request->get['path'] .= '_' . $category['category_id']; } } } } if ($url[0] == 'manufacturer_id') { $this->request->get['manufacturer_id'] = $url[1]; } if ($url[0] == 'information_id') { $this->request->get['information_id'] = $url[1]; } if ($query->row['query'] && $url[0] != 'information_id' && $url[0] != 'manufacturer_id' && $url[0] != 'category_id' && $url[0] != 'product_id') { $this->request->get['route'] = $query->row['query']; } } else { $this->request->get['route'] = 'error/not_found'; break; } } if (!isset($this->request->get['route'])) { 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'; } } if (isset($this->request->get['route'])) { return new Action($this->request->get['route']); } } } public function rewrite($link) { $url_info = parse_url(str_replace('&amp;', '&', $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 && $query->row['keyword']) { $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 && $query->row['keyword']) { $url .= '/' . $query->row['keyword']; } else { $url = ''; break; } } unset($data[$key]); } else { $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE `query` = '" .$data['route'] . "'"); if ($query->num_rows && $query->row['keyword']) { $url .= '/' . $query->row['keyword']; unset($data[$key]); } } } } if ($url) { unset($data['route']); $query = ''; if ($data) { foreach ($data as $key => $value) { $query .= '&' . rawurlencode((string)$key) . '=' . rawurlencode((string)$value); } if ($query) { $query = '?' . str_replace('&', '&amp;', 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 { return $link; } } не public function index() { $this->load->model('catalog/category'); // 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_']); // remove any empty arrays from trailing if (utf8_strlen(end($parts)) == 0) { array_pop($parts); } $categories = array(); for ($i = 0; $i < count($parts); $i++) { $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE keyword = '" . $this->db->escape($parts[$i]) . "'"); 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') { $categories[$i] = $this->model_catalog_category->getCategory($url[1]); if (!isset($this->request->get['path'])) { $this->request->get['path'] = $categories[$i]['category_id']; } else { foreach ($query->rows as $row) { $url = explode('=', $row['query']); $category_id = $url[1]; $category = $this->model_catalog_category->getCategory($category_id); if ($category['parent_id'] == $categories[$i - 1]['category_id']) { $this->request->get['path'] .= '_' . $category['category_id']; } } } } if ($url[0] == 'manufacturer_id') { $this->request->get['manufacturer_id'] = $url[1]; } if ($url[0] == 'information_id') { $this->request->get['information_id'] = $url[1]; } if ($query->row['query'] && $url[0] != 'information_id' && $url[0] != 'manufacturer_id' && $url[0] != 'category_id' && $url[0] != 'product_id') { $this->request->get['route'] = $query->row['query']; } } else { $this->request->get['route'] = 'error/not_found'; break; } } if (!isset($this->request->get['route'])) { 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'; } } if (isset($this->request->get['route'])) { return new Action($this->request->get['route']); } } } public function rewrite($link) { $url_info = parse_url(str_replace('&amp;', '&', $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 && $query->row['keyword']) { $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 && $query->row['keyword']) { $url .= '/' . $query->row['keyword']; } else { $url = ''; break; } } unset($data[$key]); } else { $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE `query` = '" .$data['route'] . "'"); if ($query->num_rows && $query->row['keyword']) { $url .= '/' . $query->row['keyword']; unset($data[$key]); } } } } if ($url) { unset($data['route']); $query = ''; if ($data) { foreach ($data as $key => $value) { $query .= '&' . rawurlencode((string)$key) . '=' . rawurlencode((string)$value); } if ($query) { $query = '?' . str_replace('&', '&amp;', 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 { return $link; } } не public function index() { $this->load->model('catalog/category'); // 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_']); // remove any empty arrays from trailing if (utf8_strlen(end($parts)) == 0) { array_pop($parts); } $categories = array(); for ($i = 0; $i < count($parts); $i++) { $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE keyword = '" . $this->db->escape($parts[$i]) . "'"); 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') { $categories[$i] = $this->model_catalog_category->getCategory($url[1]); if (!isset($this->request->get['path'])) { $this->request->get['path'] = $categories[$i]['category_id']; } else { foreach ($query->rows as $row) { $url = explode('=', $row['query']); $category_id = $url[1]; $category = $this->model_catalog_category->getCategory($category_id); if ($category['parent_id'] == $categories[$i - 1]['category_id']) { $this->request->get['path'] .= '_' . $category['category_id']; } } } } if ($url[0] == 'manufacturer_id') { $this->request->get['manufacturer_id'] = $url[1]; } if ($url[0] == 'information_id') { $this->request->get['information_id'] = $url[1]; } if ($query->row['query'] && $url[0] != 'information_id' && $url[0] != 'manufacturer_id' && $url[0] != 'category_id' && $url[0] != 'product_id') { $this->request->get['route'] = $query->row['query']; } } else { $this->request->get['route'] = 'error/not_found'; break; } } if (!isset($this->request->get['route'])) { 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'; } } if (isset($this->request->get['route'])) { return new Action($this->request->get['route']); } } } public function rewrite($link) { $url_info = parse_url(str_replace('&amp;', '&', $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 && $query->row['keyword']) { $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 && $query->row['keyword']) { $url .= '/' . $query->row['keyword']; } else { $url = ''; break; } } unset($data[$key]); } else { $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE `query` = '" .$data['route'] . "'"); if ($query->num_rows && $query->row['keyword']) { $url .= '/' . $query->row['keyword']; unset($data[$key]); } } } } if ($url) { unset($data['route']); $query = ''; if ($data) { foreach ($data as $key => $value) { $query .= '&' . rawurlencode((string)$key) . '=' . rawurlencode((string)$value); } if ($query) { $query = '?' . str_replace('&', '&amp;', 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 { return $link; } } 

Код разбивки на страницы выглядит следующим образом:

 class Pagination { public $total = 0; public $page = 1; public $limit = 20; public $num_links = 8; public $url = ''; public $text_first = '|&lt;'; public $text_last = '&gt;|'; public $text_next = '&gt;'; public $text_prev = '&lt;'; public function render() { $total = $this->total; if ($this->page < 1) { $page = 1; } else { $page = $this->page; } if (!(int)$this->limit) { $limit = 10; } else { $limit = $this->limit; } $num_links = $this->num_links; $num_pages = ceil($total / $limit); $this->url = str_replace('%7Bpage%7D', '{page}', $this->url); $output = '<ul class="pagination">'; if ($page > 1) { $output .= '<li><a href="' . str_replace('{page}', 1, $this->url) . '">' . $this->text_first . '</a></li>'; $output .= '<li><a href="' . str_replace('{page}', $page - 1, $this->url) . '">' . $this->text_prev . '</a></li>'; } if ($num_pages > 1) { if ($num_pages <= $num_links) { $start = 1; $end = $num_pages; } else { $start = $page - floor($num_links / 2); $end = $page + floor($num_links / 2); if ($start < 1) { $end += abs($start) + 1; $start = 1; } if ($end > $num_pages) { $start -= ($end - $num_pages); $end = $num_pages; } } for ($i = $start; $i <= $end; $i++) { if ($page == $i) { $output .= '<li class="active"><span>' . $i . '</span></li>'; } else { $output .= '<li><a href="' . str_replace('{page}', $i, $this->url) . '">' . $i . '</a></li>'; } } } if ($page < $num_pages) { $output .= '<li><a href="' . str_replace('{page}', $page + 1, $this->url) . '">' . $this->text_next . '</a></li>'; $output .= '<li><a href="' . str_replace('{page}', $num_pages, $this->url) . '">' . $this->text_last . '</a></li>'; } $output .= '</ul>'; if ($num_pages > 1) { return $output; } else { return ''; } } } 

РЕДАКТИРОВАТЬ:

Все мои страницы перенаправляются на http://domain.com/index.php. Оттуда он решает, какой каталог / файл использовать из параметра маршрута. Таким образом, route=product/product сообщает, что product.php внутри product.php каталога. Продукт каталога также содержит route=product/category который ведет к маршруту: route=product/category

Переменная Path из строки представляет идентификатор категории. В моем примере 25 означает In-Stock . И 25_28 означает In-Stock/Retreaded-Tires и т. Д.

Переменная product_id представляет собой соответствующий идентификатор для продукта.

Переменная страницы представляет собой разбиение на страницы и используется в списке продуктов в категории. Этот список может иметь переменную длину, поскольку он вычисляет, сколько продуктов находится в пределах категории, и сколько он должен показывать на 1 странице. Поэтому, если исходный url имеет &page=2 с маршрутом route=product/category он должен сделать такой URL: http://domain.com/Tire-Retreading/Equalizing/2

Я до сих пор считаю, что добавленные объяснения запутывают, и это звучит для меня так, как будто вы не совсем знаете, как работает переписывание URL-адресов, поэтому я попытаюсь объяснить некоторые основы перезаписи URL .

Что вы можете сделать при перезаписи URL-адресов, это перевести «красивые» сегменты URL-адресов (URL-адресов, отображаемых пользователю) в сегменты ваших реальных, длинных, «некрасивых» URL-адресов (которые используют переменные для обслуживания определенного контента). Вы делаете это, используя регулярные выражения для соответствия симпатичным сегментам, а затем предоставляя либо заранее определенные значения, либо соответствующие значения вашим переменным php.

Итак, что вы делаете в первую очередь, это выяснить, как выглядят ваши симпатичные URL-адреса и как их отдельные сегменты переводят ваши переменные. (Хотя вы можете, конечно, также использовать любое количество новых переменных, значения которых затем можно преобразовать и назначить уже существующим или предварительно определенным переменным в ваших php-скриптах.)

Вы привели этот пример: http://example.com/Tire-Retreading/Equalizing/2

Этот URL-адрес состоит из трех частей, которые вы хотите перевести на переменные:

  • Tire-Retreading (переменный route )
  • Equalizing (переменный path )
  • 2 (переменная page )

Вам нужно будет создать свой RegEx для соответствия вашим сегментам на основе всех возможных способов записи отдельных сегментов, включая любые специальные символы, которые разрешены и т. Д. После этого вы можете передать согласованные значения вашим переменным, используя обратную ссылку (или вы можете определить свои собственные значения, которые будут использоваться вашими переменными).

Используя обратные ссылки, вы можете использовать это:

 RewriteRule ^([A-Za-z-]+)/([A-Za-z-]+)/([0-9]+)$ index.php?route=$1&path=$2&page=$3 [NC,L] 

Вам нужно будет поместить отдельный RegEx для соответствия сегмента (например, [A-Za-z-]+ ) в круглых скобках, чтобы иметь возможность присваивать результаты вашим php-переменным в виде $1 , $2 и т. Д.

В зависимости от того, должны ли пользователи также просматривать страницы обзора для ваших продуктов / категорий или путей или нет, возможно, вам придется начать переписывать с наименьшего возможного «красивого» URL-адреса до самого длинного.

Например

 RewriteRule ^([A-Za-z-]+)$ $1/ [NC,R] RewriteRule ^([A-Za-z-]+)/$ index.php?route=$1 [NC,L] RewriteRule ^([A-Za-z-]+)/([A-Za-z-]+)$ $1/$2/ [NC,R] RewriteRule ^([A-Za-z-]+)/([A-Za-z-]+)/$ index.php?route=$1&path=$2 [NC,L] RewriteRule ^([A-Za-z-]+)/([A-Za-z-]+)/([0-9]+)$ $1/$2/$3/ [NC,R] RewriteRule ^([A-Za-z-]+)/([A-Za-z-]+)/([0-9]+)/$ index.php?route=$1&path=$2&page=$3 [NC,L] 

Переписывание для самого домена идет перед переходом на «путь».

Вам также нужно выяснить, какие флаги – часть в квадратных скобках в конце – вам нужно использовать, то есть вам нужно будет более подробно прочитать ссылку на переписывание URL . В приведенном выше примере все URL-адреса, которые пользовательские типы, которые не заканчиваются косой чертой, автоматически перенаправляются (это то, что означает R в квадратных скобках), с одним и тем же URL-адресом, но с добавленной косой чертой. Итак, http://example.com/blah будет перенаправляться на http://example.com/blah/ и т. Д.

Основываясь на информации, которую вы предоставили, у вас будут URL-адреса, начинающиеся с одного из двух возможных сегментов:

 http://example.com/In-Stock/... 

против

 http://example.com/Product-or-Category/.... 

Таким образом, вам придется проявлять особую осторожность, эти два не путаются. Если In-Stock попадает в свою собственную переменную и всегда записывается точно так же, вы, вероятно, захотите, чтобы ваши первые правила справились с этим, и используйте RegEx для соответствия продуктов / категорий только позже (все правила перезаписи обрабатываются в хронологическом порядке, один за другим).

Надеюсь, это поможет.