С разделом, возможно, ошибся, сори. Код ведёт себя странно и не видит файлы которые существуют. Код (Text): ... RewriteCond %{REQUEST_FILENAME} !-f ... RewriteRule ^([^/\.]+)/([^/\.]+)/([^/\.]+)\.html$ index.php?category=$1§ion=$2&element=$3&ha=%{REQUEST_FILENAME} [L] ... Вкратце теорию: RewriteCond - Определяет условие при котором происходит преобразование, условие следущее: %{REQUEST_FILENAME} - запрашиваемый файл, !-f - не является файлом (не существует) Далее само преобразование запроса ( строки вида abcdefgh/abcdefgh/abcdefgh.html если файла не существует то перенаправляем на index.php с параметрами.., например: /news/business/newbiz-for-you.html --->>> index.php?category=news§ion=business&item=newbiz-for-you ) Итак преобразование должно осуществляться только тогда, когда файла не существует. Тут мне взбрело в голову посмотреть, как выглядит шаблон сайта в браузере (theme/tpls/main.html). Он реально есть по этому пути, я его собственно запрашиваю, но срабатывает преобразование!!! И кноечно меня кидает на 404 страницу. Сейчас углубляюсь где же может быть косяк, вроде всё просто до безумия, но не работает как хочется. код htaccess Код (Text): # Включаем модуль mod_rewrite выполняющий URL преобразования на лету RewriteEngine on # Устанавливает базовый URL для преобразований в каталоге RewriteBase / # Перенаправление с адреса без www на адрес с www. R[=code] - вызывает редирект. L - чтобы не преобразовывать текущий URL другими правилами преобразований. QSA - добавлять строку запроса # Перенаправление с явным указанием переменной RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteCond %{HTTP_HOST} !^$ RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L] # Перенаправление вручную #RewriteCond %{HTTP_HOST} ^domen.ru [NC] #RewriteCond %{HTTP_HOST} !^$ #RewriteRule ^(.*)$ http://www.domen.ru/$1 [R=301,L] # Перенаправление с адреса с www на адрес без www ##RewriteCond %{HTTP_HOST} ^www\.(.*) [NC] ##RewriteRule ^(.*)$ http://%1/$1 [R=301,L] # Админка RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^admin/([^/\.]+)/?$ /admin/index.php?category=$1 [L,QSA] # Сайт RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^/\.]+)/?$ index.php?category=$1 [L] RewriteRule ^([^/\.]+)/([0-9]+)/?$ index.php?category=$1&page=$2 [L] RewriteRule ^([^/\.]+)/([^/\.]+)/?$ index.php?category=$1§ion=$2 [L] RewriteRule ^([^/\.]+)/([^/\.]+)/([0-9]+)/?$ index.php?category=$1§ion=$2&page=$3 [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^([^/\.]+)/([^/\.]+)\.html$ index.php?category=$1&element=$2 [L] RewriteRule ^([^/\.]+)/([^/\.]+)/([^/\.]+)\.html$ index.php?category=$1§ion=$2&element=$3&ha=%{REQUEST_FILENAME} [L] RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^.*$ 404/ # Шпаргалка # RewriteCond # [flags]: # 'nocase|NC' - регистронезависимо # 'ornext|OR' - либо следующее условие # '-d' является ли каталогом # '-f' является ли обычным файлом # '-s' является ли обычным файлом с ненулевым размером # '-l' является ли символической ссылкой # '-F' проверка существования файла через подзапрос # '-U' проверка существования URL через подзапрос Добавлено спустя 17 минут 16 секунд: Блин, нашел где копать, работает как хочу если так: Код (Text): RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^([^/\.]+)/([^/\.]+)\.html$ index.php?category=$1&element=$2 [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^([^/\.]+)/([^/\.]+)/([^/\.]+)\.html$ index.php?category=$1§ion=$2&element=$3&ha=%{REQUEST_FILENAME} [L] Я то думал что RewriteCond объединяющее условие для всех последующих RewriteRule. Может [L] тому причина Добавлено спустя 7 минут 49 секунд: Нихрина себе ошибочка, как у меня вообще всё работает %) ???
чувак, а не п роще ли RewriteRule ^.*\.html$ index.php =) а в индексе просто добавь воды implode('/', $_SERVER['REQUEST_URI'])
ты не первый кто мне это советует) и я параллельно пишу ещё один собственный движок с разбором запроса в php а тут вся прелесть в том, что у меня в индексе нет воды =) теоретически можно углубиться в воду очень глубоко, а если сайт простенький то этого не надо мне кажется тут дело вкуса..: с помощью этого прекрасного модуля я могу описать всю структуру ЧПУ сайта очень наглядно (я считаю этот код довольно наглядным: Код (Text): RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^/\.]+)/?$ index.php?category=$1 [L] RewriteRule ^([^/\.]+)/([0-9]+)/?$ index.php?category=$1&page=$2 [L] RewriteRule ^([^/\.]+)/([^/\.]+)/?$ index.php?category=$1§ion=$2 [L] RewriteRule ^([^/\.]+)/([^/\.]+)/([0-9]+)/?$ index.php?category=$1§ion=$2&page=$3 [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^([^/\.]+)/([^/\.]+)\.html$ index.php?category=$1&element=$2 [L] RewriteRule ^([^/\.]+)/([^/\.]+)/([^/\.]+)\.html$ index.php?category=$1§ion=$2&element=$3 [L] ) в идеале если запрос не соответствует структуре, то посылается на *** 404.php, срочно, без implode и попадания в index.php ... Добавлено спустя 7 минут 28 секунд: Неужто кроме меня этот модуль никто не изучает? =( очень мало ответов когда я пишу вопросы связанные с модреврайт Ещё один минибаг: в документации можно так: Код (Text): RewriteCond ... ... [OR] RewriteCond ... ... [OR] RewriteCond ... ... RewriteRule ...some special stuff for any of these hosts... А на моём сервере, если вставить [OR] апач уходит в 500 (((
от сердца отрываю Код (PHP): <?php class URI { public static $url = '', $section = false, $entry = false, $action = false, $param = false, $shifted = false; private static $shift = 1; public static function Init() { $url = parse_url($_SERVER['REQUEST_URI']); self::$url = $url['path']; $url['path'] = trim($url['path'], '/'); $s = explode('/', $url['path'], self::$shift); $path = explode('/', array_pop($s), 5); self::$shifted = $s; if (is_array($path)) { if (isset($path[0]) AND $path[0] !== '') self::$section = strtolower($path[0]); if (isset($path[1]) AND $path[1] !== '') self::$entry = strtolower($path[1]); if (isset($path[2]) AND $path[2] !== '') self::$action = strtolower($path[2]); if (isset($path[3]) AND $path[3] !== '') self::$param = strtolower($path[3]); } } public static function Shift() { self::$shift++; self::Init(); } } URI::Init();
а можно пояснение структуры чпу? секция(section) - страница сайта - допустим, понятно. entry, action, param - как это едят, что это? И интересно ваше мнение на мою "самоделкину" структуру сайтостроения: catgory/section/item.html catgory - страницы сайта. например: /mypage/ или /contacts/ или /news/ могут содержать текст - статические, но могут содержать спец тэг ??news??, тогда подключается модуль новостей и в страницу сбрасывает нужный от ситуации контент, например постраничный вывод новостей: /news/1/, /news/2/ ... или сама новость: /news/first-news.html (надеюсь понятно) section - понятное дело, новостей много, хотим группировать, получаем возможные варианты: catgory/ catgory/page/ catgory/section/ catgory/section/page/ catgory/item.html или catgory/section/item.html а вот для меня пока загадка. Видимо позаимствовано из какого нибудь хорошего продуманного движка c фильдеперсовой MVC схемой? =) Добавлено спустя 3 минуты 23 секунды: как видите, в моей схеме ЧПУ на втором месте (после /catgory/) у меня может быть как /page/ так и /section/ и регуляркой хорошо определяется что имеется в виду
/section/entry/action/всё остальное /news/7/edit как пример можешь назвать как хочешь свои сам. суть проста - потрошить реквест ури извнутре пхп и не парить себе голову. потрошить без регулярок простым имплодом.
в малых проектах нехочу, так как мои 8 строк регулярных не считаю за мне гораздо сложнее прочитать 8 if в пхп коде. После моих регулярок мне остается описать сам алгоритм используя примерно такое: Код (Text): if isset($_GET['section']) тармам пам пам else турум пум пум в общем спасибо за класс, в новом своём движке переношу логику в пхп, там для SEO внедрятся такая штука: /турум/пум/пум/тарам/пам/пам/бац/ /турум/пум/пум/ - определяет выводимую страницу, несмотря на то, что нужен лишь последний /пум/ (являющийся строковым ID выводимой страницы) в ЧПУ отображается весь путь (древовидная структура страниц сайта) до нужной страницы.
Но зачем делать Cond если ты опять делаешь запрос на файл?! ha=%{REQUEST_FILENAME} Похоже в этом проблема. ha=%1 или какой там, по счету вызов файла. Мой, вам совет! Чем больше вложенность /././././, тем хуже роботу.
чисто для проверки, в рабочей версии нет абсолютно вы правы, просто эксперимент провел в своём случае согласен, но если контента дожопы и он действительно по смыслу имеет древовидную структуру, то почему бы не реализовать её в ЧПУ, особенно, когда кроме таких страниц /././././, существуют и такие /./././ и такие /././ (тоесть действительно объединяющие (корневые) страницы - существуют) Добавлено спустя 1 минуту 17 секунд: ну 5-6 вложений я думаю сожрет не поперхнется