OpenCart

Статья "Как работает ЧПУ в OpenCart"

Вся хитрость в вот этом куске кода в загрузочном файле (index.php в корне):
// SEO URL's
$controller->addPreAction(new Action('common/seo_url'));	
Собственно, он добавляет вызов контроллера common/seo_url перед тем, как будет вызван контроллер текущей страницы. А что внутри?
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';
		}
		
		if (isset($this->request->get['route'])) {
			return $this->forward($this->request->get['route']);
		}
	}
}
Думаю, здесь особо и пояснять ничего не нужно. Достаточно просто внимательно посмотреть на код контроллера и будет понятно, как оно работает :) Если все-таки не понятно, пишите в комментариях - поясню...