К сожалению, адекватного решения нам найти не удалось. Пока никто не сообразил хороший модуль ЧПУ, мы придумали временное решение.
можно добавить фикс в точку входа index.php (в самое начало файла):
/**
* Fix by RPN (fix link)
*/
$_serverUri = trim($_SERVER["REQUEST_URI"],"/");
$_expServerUri = explode("?",$_serverUri);
function str_replace_once($search, $replace, $text)
{
$pos = strpos($text, $search);
return $pos!==false ? substr_replace($text, $replace, $pos, strlen($search)) : $text;
}
if (strpos($_expServerUri[0],".html") !== false) {
$_expServerUri[0] = str_replace("-","/",$_expServerUri[0]);
$_expServerUri[0] = str_replace(".html","",$_expServerUri[0]);
if (count($_expServerUri) == 1) {
$_redirUri = "/" . $_expServerUri[0];
}
else {
$_redirUri = "/" . implode("?",$_expServerUri);
}
header("HTTP/1.1 301 Moved Permanently");
header("Location: " . $_redirUri);
exit();
}
$_expServerUri[0] = str_replace("/","-",$_expServerUri[0]);
if (strpos($_expServerUri[0],"?") !== false) {
$_expServerUri[0] = str_replace_once("?",".html?",$_expServerUri[0]);
$_serverUri = "/".implode("?",$_expServerUri);
}
else {
$_expServerUri[0] .= ".html";
$_serverUri = "/".implode("?",$_expServerUri);
}
$_SERVER["REQUEST_URI"] = $_serverUri;
Сделать тоже самое на уровне апача у нас не получилось.
И с этим решением файл .htaccess в базовом варианте должен выглядеть так:
RewriteBase /
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^.*$ index.php
AddDefaultCharset UTF-8
AddType text/x-component .htc
В итоге всё работает ровно до того момента, пока не появляются многоуровневые url. Может у вас это не повторится, но на моём тестовом движке ссылки генерируются относительно страницы, а не корня сайта. Т.е. на странице site.ru/level1/level2 ссылки на каталог будут следующими: site.ru/level1/level2/catalog?cid=1. Фиксится изменением относительности от страницы относительностью от корня (вместо ссылки catalog.html?cid=1 писать /catalog.html?cid=1).
Многоуровневые урлы делаются просто: в id страницы указываем, например, catalog-filter-apple, в старом варианте страница бы выглядела как site.ru/catalog-filter-apple.html, с этим фиксом будет site.ru/catalog/filter/apple.
Ну и как рудимент ссылки на странице генерируемые остаются старого образца, но при переходе по ним будет происходить 301-редирект.