да хватит уже в каждом топике чирикать тема лебедев-тема лебедев. Как будто он там объясняет алгоритм реализации и куски кода раздает. Всякие простые url типа /company/about-us /products/stereo/samsung/sbh-400 /products/microwave у меня можно сделать но вот /products/microwave/samsung - нельзя, можно /products/microwave;samsung или /products/microwave?man=samsung /products/microwave/page-2 - нельзя, можно /products/microwave;page:2 или /products/microwave?p=2 или /products/microwave/?p=2 там, где я работаю ссылки выглядят вот так: http://www.shena.co.uk/news;news/id/37
я упомянул о нем в двух темах с одинаковым смыслом) он объяснил КАК должно выглядеть у тебя нельзя именно то, как должно быть
кстати кто тебе вообще сказал что нельзя /microwave/samsung, а можно создать новый разделить, хрен знает откуда вылезший - microwava;samsung
SeregA я сказал. Как разработчик тогда становится невозможно распарсить по-нормальному запрос. Код (Text): /products/microwave/ прикреплен к модулю товаров, категории микроволновки /products/microwave/samsung ни к чему не прикреплен. Samsung - производитель. Для него нет записи в таблице rewrites /products/microwave;samsung мы отрезаем все что слева от ; и ищем соответствие в таблице rewrites. А то что справа - просто передаем в модуль товаров, который сам уже разберется что с ним делать.
Koc ну и глупость ты сказал) такие урлы неприемлемы просто по логике. лучше юзать .../микровэйвс?самсунг я так понимаю, ты не можешь в мод_реврайте сделать реврайт по шаблону "/продукты/микроволновки/гнусмас"? насколько помню это очень просто. только строки в хтаццесс в определенном порядке надо держать - от большего к меньшему. дома у меня где то пример валяется, вечером могу кинуть ) там получается редирект на что то типа продуктс.пхп?категория=микроволновки&производитель=гнусмас
Koc, ты уж извини, но подход у тебя странный. Лучше переделай так, чтобы было /products/microwave/samsung
содержимое моего .htaccess Код (Text): Options -Indexes # # mod_rewrite rules for handling nice urls # <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / # check if requested url is alias RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule .+ index.php [L] </IfModule> Никакого products.php нету. Точка входа - одна (index.php). Еще есть admin.php, но то другая история. Мне не нужно делать по шаблону, так как URL'ы могут быть произвольными, типа /products/microwawe/kak-vibrat-microvolnovku /products/monitors/obzor-monitora-t220
ну какая разница. "index.php?section=products&category=microwave&manufacturer=samsung" тогда у меня в .хтаццесс юзалось только RewriteBase и RewriteRule. используя только их можно добиться бесконечной глубины генерации директорий. я где то тут даже читал подробнее про это. погугли)
и тут я (или тот, кто работает с каталогом) захочу разместить очки не в /products/glasses а просто в /glasses он не додумается, что нужно что-то добавить в .htaccess. У него даже доступа на ftp может не быть. SeregA как тогда отработает реврайт?
RewriteRule .+ index.php [L] Имхо, у тебя самый правильный подход. Я еще люблю RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f Ну оставлять, а все дополнительные файлы выносить в отдельный поддомен. Получается .htaccess чтото типа Код (Text): RewriteEngine On RewriteRule .* index.php [L] а в files.example.com полностью отключено исполнение любых сценариев. и лешко потом будет поддомен со статикой полностью перенести на нгинкс, например. Тем не менее, я не понимаю, в чем проблема сделать полноценный Router, который бы одинаково удачно работал бы и с /products/microwave/samsung и с чем нибудь другим.
Koc а в чем смысл размещать glasses вне products? это не логично блиин, я вечером или завтра кину образец, если не забуду я ж говорю от самого длинного (т.е. с указанием всех трех свойств) к меньшему....
Ладно, переложим всю работу с mod_rewrite полностью на РНР. Мы передаём полный URL скрипту и там его уже разбираем. Всё, что идет далее, является исключительно моими мыслями и не претендует на идеальное решение и объективность. Для начала мы определим, как и что должно выглядеть, например, мы планируем навигацию как: http://example.com/2 Навигацию по категориям как http://example.com/tv/samsung/2 Просмотр модели http://example.com/tv/samsung/model.html Любая страница в версии для печати выглядит так: http://example.com/tv/samsungrint http://example.com/tv/samsung/model.htmlrint Переходим к реализации. Объявим массив вероятных адресов (название сайта не входит, только адрес): PHP: <? $rewrite = array(); $rewrite[1] = '/([0-9]+)\/?$/s'; // Навигация $rewrite[2] = '/([^0-9]+?[a-z0-9\/]*?)\/?/s'; // Категория // Находим print if(preg_match('/:print$/s', $url)) { // Определение выражений выше } ?> Дело всё как раз в том, что бы переложить всю основную работу на РНР. Теперь, нужно обязательно условиться с делиметрами, которые мы храним в конфигурационных файлах. Если посмотреть на регулярные выражения, можно заметить детекцию слешей. Дак вот, все эти элементы можно задавать именно конфигуративно, т.е не фиксировать. Тем не менее цель красивых URL — это не каша, смешанная с говном. Любой URL должен быть структурирован. Поэтому, если брать правило второе (массив $rewrite[2]), то мы должны понимать, что строку можно разбить на категории + конечный контент. Давай попробуем: PHP: <? $sections = explode('/', trim($url, '/')); ?> В результате мы получим URL, который дальше будем анализировать. Теперь нас интересует перебрать корреткность каждой категории: PHP: <? for($i = 0; $i < count($sections); $i++) { if($i == count($sections) - 1) { // Проверяем содержание последней строки // может там записана модель с .html } } ?> Суть всего этого в том, чтобы структурировать КАЖДЫЙ из элементов запроса. Каждый элемент мы можем представить в конфигурационном файле как разделитель или определитель для URL, тем самым в любой момент изменить его вид.
А можно вопрос: Нафига нужна вероятность вложения модели в новость, например? Вполне естественно располагать категорию вне products как основную или на чем акцентируется внимание. Но ведь всё подчинено логике реврайтинга и спокойно ловится как подмножество.
Имхо, код должен подгоняться под пользовательскую историю, а не пользовательская история под код. Если пользователь сказал, что должно быть возможность сделать /glasses.html , или /products/microwave/samsung.html , значит должна быть возможность это сделать.
TheShock пользователь указывает админам сайта, на то что ему не нравится урл в истории?) давайте напишем коллективное требование в лексмарк: http://www.lexmark.com/lexmark/sequenti ... 01DBC.html вот это - действительно только богу (и то не факт) понятный урл. а кто нибудь обращал внимание как решена проблема урлов (афигенно решена кстати) в битриксе?
пользовательская история - это требования заказчика. если бы тот, кто заказывал программистам сайта www.lexmark.com сайт не был бы мудаком и хорошо бы делал свою работу, то он бы заставил их сделать нормальные урлы, а не это гавно, которое ты показал. Имхо
TheShock ВООТ, ты понял меня. SeregA в данном случае пользователь - человек, который строит на основе системы себе сайт (заказчик).
ты уж извини, лень лезть в код Битрикса. Не был бы ты так добр, в двух словах рассказать о решении Битрикса?
TheShock http://www.1c-bitrix.ru/products/cms/usability.php - пример там нет никакого модреврайта, для раздела "prоducts" имеется дисковый каталог на сервере. в нем лежит index.php, который содержит примерно такой код: PHP: <?include($_SERVER['DOCUMENT_ROOT']."/system/start.php"); ShowTemplateBlock("header"); ?> ---> PAGE BODY <--- <? include($_SERVER['DOCUMENT_ROOT']."/system/stop.php"); ?> также в разделе лежит, предположим, section.php, в котором переменными задаются права доступа к этому разделу, название раздела для строки навигации и для заголовка окна взято из моей системы, но принцип я честно с 3.15здил с битрикса) а при редактировании страницы через админ панель, пхп код в начале и в конце просто не отображается.
да. а если на странице надо вывести к примеру последние новости там юзается чтото типа ShowComponent($component_name,$parameter_1,$parameter_2,...); где component_name - имя компонента, parameter_1 - первое значение передаваемое функции (напр какой заголовок указать - "события" или "последние новости), parameter_2 - то же что и параметр_1 (например сколько новостей вывести в блок)
фигня. Я могу сделать шаблон, из которого вызову последние новости, из такой-то категории, так-то отсортированные, и которые будут отрендерены в таком-то шаблоне.