не много кода))
.htaccess
##################################### # ShopCMS: Скрипт интернет-магазина # Copyright (c) by ADGroup # http://shopcms.ru ##################################### Options +FollowSymlinks -Indexes -MultiViews DirectoryIndex index.php ErrorDocument 404 /404.html php_value session.use_trans_sid 0 php_value session.use_cookies 1 php_value session.use_only_cookies 1 php_value session.auto_start 0 php_value magic_quotes_gpc 0 php_value register_globals 0 php_value display_errors 0 php_value magic_quotes_runtime 0 php_value allow_url_fopen 1 RewriteEngine On RewriteBase / RewriteCond %{HTTP_HOST} ^site\.ru$ [NC] RewriteRule ^(.*)$ http://www.site.ru/$1 [R=301,L] RewriteCond %{THE_REQUEST} /(\.+) [OR] RewriteCond %{THE_REQUEST} /(\?+) [OR] RewriteCond %{THE_REQUEST} /(/+) RewriteRule ^(.*)$ 404.html [L] RewriteRule ^core/(install|temp|smarty|modules|languages|includes|functions|fonts|files|config|classes|cache|backup)/(.*) - [F] RewriteRule ^data/(.+)\.(tpl\.html|php|php3|php4|php5|phtml|pl|cgi) - [F] RewriteRule ^install_check\.html$ install.php?check=yes [L] RewriteRule ^index\.html$ index.php [L] #RewriteRule ^news\.html$ index.php?news=yes [L] RewriteRule ^price\.html$ index.php?show_price=yes [L] RewriteRule ^cart\.html$ index.php?shopping_cart=yes [L] RewriteRule ^wide_search\.html$ index.php?search_with_change_category_ability=yes [L] RewriteRule ^feedback\.html$ index.php?feedback=yes [L] RewriteRule ^compare\.html$ index.php?comparison_products=yes [L] RewriteRule ^page_([0-9]+)\.html$ index.php?show_aux_page=$1 [L] RewriteRule ^product_([0-9]+)\.html$ index.php?productID=$1 [L] RewriteRule ^category_([0-9]+)\.html$ index.php?categoryID=$1 [L] RewriteRule ^category_([0-9]+)_offset_([0-9]+)\.html$ index.php?categoryID=$1&offset=$2 [L] RewriteRule ^category_([0-9]+)_show_all\.html$ index.php?categoryID=$1&show_all=yes [L] RewriteRule ^show_news_([0-9]+)\.html$ index.php?fullnews=$1 [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^.]+)(?<!/)$ /$1/ [R=301,L] RewriteRule ^news/$ index.php?news=yes [L] RewriteRule ^news/([a-z0-9_-]+)\.html$ index.php?news_alias=$1 [L] RewriteRule ^news/([0-9]+)/$ index.php?news=yes&offset=$1 [L] RewriteRule ^news/all/$ index.php?news=yes&show_all=yes [L] RewriteRule ^page/([a-z0-9_-]+).html$ index.php?aux_alias=$1 [L] RewriteRule ^([a-z0-9_/-]+)/([0-9]+)/$ index.php?cat_alias=$1&offset=$2 [L] RewriteRule ^([a-z0-9_/-]+)/all/$ index.php?cat_alias=$1&show_all=yes [L] RewriteRule ^([a-z0-9_/-]+)$ index.php?cat_alias=$1 [L] RewriteRule ^([a-z0-9_-]+)\.html$ index.php?prod_alias=$1 [L]
Участок формирование ЧПУ в модуле:
<? function translit($str) { $transtable = array(); $transtable = array( 'А' => 'A', 'Б' => 'B', 'В' => 'V', 'Г' => 'G', 'Д' => 'D', 'Е' => 'E', 'Ё' => 'Yo', 'Ж' => 'Zh', 'З' => 'Z', 'И' => 'I', 'Й' => 'Y', 'К' => 'K', 'Л' => 'L', 'М' => 'M', 'Н' => 'N', 'О' => 'O', 'П' => 'P', 'Р' => 'R', 'С' => 'S', 'Т' => 'T', 'У' => 'U', 'Ф' => 'F', 'Х' => 'H', 'Ц' => 'Ts', 'Ч' => 'Ch', 'Ш' => 'Sh', 'Щ' => 'Shch', 'Ъ' => '', 'Ы' => 'I', 'Ь' => '', 'Э' => 'E', 'Ю' => 'Yu', 'Я' => 'Ya', 'а' => 'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd', 'е' => 'e', 'ё' => 'yo', 'ж' => 'zh', 'з' => 'z', 'и' => 'i', 'й' => 'y', 'к' => 'k', 'л' => 'l', 'м' => 'm', 'н' => 'n', 'о' => 'o', 'п' => 'p', 'р' => 'r', 'с' => 's', 'т' => 't', 'у' => 'u', 'ф' => 'f', 'х' => 'h', 'ц' => 'ts', 'ч' => 'ch', 'ш' => 'sh', 'щ' => 'shch', 'ъ' => '', 'ы' => 'i', 'ь' => '', 'э' => 'e', 'ю' => 'yu', 'я' => 'ya', ' ' => '-'); $str = strtr($str, $transtable); return $str; } function aliasClearAlias($alias, $name="") { $name = str_replace(" ","-", trim($name)); $name = strtolower(translit($name)); $name = preg_replace('#[^a-z0-9_-]+#i', '', $name); $alias = str_replace(" ","-", trim($alias)); $alias = strtolower(translit($alias)); $alias = preg_replace('#[^a-z0-9_-]+#i', '', $alias); if ($alias=="") $alias = $name; return $alias; } //Дополнительные страницы function auxCheckAlias($alias, $id, $type="add") { if ($type=="upd") $q = db_query("SELECT COUNT(*) FROM ".AUX_PAGES_TABLE." WHERE alias='".xEscSQL($alias)."' AND aux_page_ID<>".(int)$id); else $q = db_query("SELECT COUNT(*) FROM ".AUX_PAGES_TABLE." WHERE alias='".xEscSQL($alias)."'"); $r = db_fetch_row($q); $res = $r[0]; if ($res>0) return ""; return $alias; } function aliasGenerateAliasAux($id, $alias, $name, $type) { $alias = aliasClearAlias($alias, $name); $alias = auxCheckAlias($alias, $id, $type); db_query("UPDATE ".AUX_PAGES_TABLE." SET alias='".xEscSQL($alias)."' WHERE aux_page_ID=".(int)$id); } function auxGetDataByAlias($alias) { $alias = preg_replace('#[^a-z0-9_-]+#i', '', $alias); $q = db_query("SELECT aux_page_ID FROM ".AUX_PAGES_TABLE." WHERE alias='".xEscSQL($alias)."'"); if ($r = db_fetch_row($q)) { $_GET['show_aux_page'] = (int)$r[0]; return; } else { header("HTTP/1.0 404 Not Found"); header("HTTP/1.1 404 Not Found"); header("Status: 404 Not Found"); die(ERROR_404_HTML); exit; } } //Новсоти function newsCheckAlias($alias, $id, $type="add") { if ($type=="upd") $q = db_query("SELECT COUNT(*) FROM ".NEWS_TABLE." WHERE alias='".xEscSQL($alias)."' AND NID<>".(int)$id); else $q = db_query("SELECT COUNT(*) FROM ".NEWS_TABLE." WHERE alias='".xEscSQL($alias)."'"); $r = db_fetch_row($q); $res = $r[0]; if ($res>0) return ""; return $alias; } function aliasGenerateAliasNews($id, $alias, $name, $type) { $alias = aliasClearAlias($alias, $name); $alias = newsCheckAlias($alias, $id, $type); db_query("UPDATE ".NEWS_TABLE." SET alias='".xEscSQL($alias)."' WHERE NID=".(int)$id); } function newsGetDataByAlias($alias) { $alias = preg_replace('#[^a-z0-9_-]+#i', '', $alias); $q = db_query("SELECT NID FROM ".NEWS_TABLE." WHERE alias='".xEscSQL($alias)."'"); if ($r = db_fetch_row($q)) { $_GET['fullnews'] = (int)$r[0]; return; } else { header("HTTP/1.0 404 Not Found"); header("HTTP/1.1 404 Not Found"); header("Status: 404 Not Found"); die(ERROR_404_HTML); exit; } } //Товары function prodCheckAlias($alias, $id, $type="add") { if ($type=="upd") { $q = db_query("SELECT COUNT(*) FROM ".PRODUCTS_TABLE." WHERE alias='".xEscSQL($alias)."' AND productID<>".(int)$id); $r = db_fetch_row($q); $res = $r[0]; return $alias; } else { $q = db_query("SELECT COUNT(*) FROM ".PRODUCTS_TABLE." WHERE alias='".xEscSQL($alias)."'"); $r = db_fetch_row($q); $res = $r[0]; if ($res>0) return ""; return $alias; } } function aliasGenerateAliasProd($id, $alias, $name, $type) { $alias = aliasClearAlias($alias, $name); $alias = prodCheckAlias($alias, $id, $type); db_query("UPDATE ".PRODUCTS_TABLE." SET alias='".xEscSQL($alias)."' WHERE productID=".(int)$id); } function prodGetDataByAlias($alias) { $alias = preg_replace('#[^a-z0-9_/-]+#i', '', $alias); $get = explode('/', trim($alias, '/')); $c = sizeof($get)-1; $alias = preg_replace('#[^a-z0-9_-]+#i', '', $get[$c]); $q = db_query("SELECT productID FROM ".PRODUCTS_TABLE." WHERE alias='".xEscSQL($alias)."'"); if ($r = db_fetch_row($q)) { $_GET['productID'] = $r['productID']; return; } else { header("HTTP/1.0 404 Not Found"); header("HTTP/1.1 404 Not Found"); header("Status: 404 Not Found"); die(ERROR_404_HTML); exit; } } //Категории function catCheckAlias($alias, $id, $type="add") { if ($type=="upd") $q = db_query("SELECT COUNT(*) FROM ".CATEGORIES_TABLE." WHERE alias='".xEscSQL($alias)."' AND categoryID<>".(int)$id); else $q = db_query("SELECT COUNT(*) FROM ".CATEGORIES_TABLE." WHERE alias='".xEscSQL($alias)."'"); $r = db_fetch_row($q); $res = $r[0]; if ($res>0) return ""; return $alias; } function aliasGenerateAliasCat($id, $alias, $name, $type) { $alias = aliasClearAlias($alias, $name); $alias = catCheckAlias($alias, $id, $type); db_query("UPDATE ".CATEGORIES_TABLE." SET alias='".xEscSQL($alias)."' WHERE categoryID=".(int)$id); } function catGetDataByAlias($alias) { if (($_GET['offset'] || $_GET['show_all']) && substr($_GET['cat_alias'], -1)!="/") { $_GET['cat_alias'] .= "/"; $alias = $_GET['cat_alias']; } if (substr($alias, -1)!="/") { header("HTTP/1.1 301 Moved Permanently"); header("Location: /".$alias."/"); exit(); } $alias = preg_replace('#[^a-z0-9_/-]+#i', '', $alias); $get = explode('/', trim($alias, '/')); $c = sizeof($get)-1; $alias = preg_replace('#[^a-z0-9_-]+#i', '', $get[$c]); $q = db_query("SELECT categoryID FROM ".CATEGORIES_TABLE." WHERE alias='".xEscSQL($alias)."'"); if ($r = db_fetch_row($q)) { $_GET['categoryID'] = (int)$r['categoryID']; return; } else { header("HTTP/1.0 404 Not Found"); header("HTTP/1.1 404 Not Found"); header("Status: 404 Not Found"); die(ERROR_404_HTML); exit; } } //Генерируем ссылки function m_Aux($alias) { $url = "page/".$alias.".html"; return $url; } function m_AuxID($id) { $q = db_query("SELECT alias FROM ".AUX_PAGES_TABLE." WHERE aux_page_ID='".(int)$id."'"); $r = db_fetch_row($q); $url = "page/".$r[0].".html"; return $url; } function m_News($alias) { $url = "news/".$alias.".html"; return $url; } function m_Cat($id, $url="") { global $fc; $r = array(); if ($id>1) { $r = $fc[$id]; if ($r) { if ($url=="") $url = "/".$r['alias']; else $url = $r['alias']."/".trim($url, "/"); if ($r['parent']>1) $url = m_Cat($r['parent'], $url); } } return trim($url, "/")."/"; } function m_Prod($r) { $url = ""; if ($r) { $url = $r['alias'].".html"; } return $url; } function aliasGetDataByAlias() { if ($_GET['news_alias']) { newsGetDataByAlias($_GET['news_alias']); return true; } elseif ($_GET['aux_alias']) { auxGetDataByAlias($_GET['aux_alias']); return true; } elseif ($_GET['cat_alias']) { catGetDataByAlias($_GET['cat_alias']); return true; } elseif ($_GET['prod_alias']) { prodGetDataByAlias($_GET['prod_alias']); return true; } else return false; } ?>
Так вот в чем суть:
при ссылки на товар site.ru/XXXXXXXX.html? (знак вопроса на конце отрабатывается, т.е дубль страницы) - работает.
при ссылки на доп. страницу site.ru/page/XXXXXXX.html? (знак вопроса на конце отрабатывается, т.е дубль страницы) - работает.
А вот дальше косяки:
при ссылки на список новостей: site.ru/news/? не отрабатывает
при ссылки на категорию: site.ru/XXXXXXXXXX/? или site.ru/XXXXXXXXX/XXXXXXX/? и т.д - не отрабатывает
Помогите пожалуйста в решении проблемы.