Проектирование CMS

ExcluZZ

Новичок
Проектирование CMS

Я не профессиональный программист, но уровень мой (по моему мнению :) не плохой).
У меня уже существует cms на которой существует несколько проектов, и пришло время ее модернизации, т.к. она не справляется с новыми задачами, и в целом не столь удобна и функциональна как хотелось бы. Я решил с нуля переворошить ее. Отдельной темой решил начать обсуждение, т.к. вопросов будет несколько, объединенных моими задачами, и хотелось бы в свободной форме обсудить их услышать умные и не очень советы и критику.

Самым первым вопросом для меня встает насколько корректно обрабатывать все запросы пользователя через один файл(index.php) по средствам mod rewrite. Текст содержащий .htaccess таков:

RewriteEngine On

RewriteCond %{REQUEST_URI} !^/styles/(.*)$
RewriteCond %{REQUEST_URI} !^/images/(.*)$
RewriteCond %{REQUEST_URI} !^/files/(.*)$
RewriteCond %{REQUEST_URI} !^/scripts/(.*)$
RewriteCond %{REQUEST_URI} !^/admin/admin_style.css$
RewriteCond %{REQUEST_URI} !^/admin/tiny_mce/(.*)$
RewriteRule ^(.*)\.(.*)/?$ index.php

RewriteCond %{REQUEST_URI} !^/styles/(.*)$
RewriteCond %{REQUEST_URI} !^/images/(.*)$
RewriteCond %{REQUEST_URI} !^/files/(.*)$
RewriteCond %{REQUEST_URI} !^/scripts/(.*)$
RewriteCond %{REQUEST_URI} !^/admin/admin_style.css$
RewriteCond %{REQUEST_URI} !^/admin/tiny_mce/(.*)$
RewriteRule ^(.*)/?$ index.php
Т.е. выше указанный код перенаправляет все запросы, кроме запросов к изабражениям, файлам, ситилям и т.п. на index.php а этот скрипт берет $REQUEST_URI и определяет нужную строку из БД для вывода соответствующей страницы, представленной в определенном дизайне и в определенном модуле..

Насколько это правильно, насколько это удобно? каково это с позиции безопастности? какие проблемы могут возникнуть в будущем из-за такой организации?
 

Beavis

Banned
это удобно, и во многих фреймворках так и делается

только по-моему проще htaccess написать вот так:

Код:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]
 

ExcluZZ

Новичок
Т.е. это универсальный код, без конкретных исключений. Перенаправление всех ненайденный файлов на индекс? Если это так, для меня это гараздо удобнее чем мой вариант, спасибо буду пробовать..
Хотелось бы слышать еще мнения..

Если можно расшифровку кода вкратце хочется видеть, чтобы не тупо совать код, а понимать как работает..
 

damngood

Мозг был, но ушел...
У меня использует почти такой же механизм перенаправления запросов, кроме прочего я переписываю все адреса так, чтобы они имели на конце - замершающий слэш / и использую дополнительные куски, для своих нужд.
 

Beavis

Banned
ExcluZZ
если тебе действительно хочется разобраться в реврайтах которые я написал, потрать 5 минут на чтение документации, там всё довольно понятно и подробно написано
 

pilot911

Новичок
мне кажется, идея с index.php не подойдет для административной части сайта, имхо, в ней лучше иметь один обработчик на каждый модуль
 

Beavis

Banned
pilot911
"в ней лучше иметь один обработчик на каждый модуль"

кому лучше? чем лучше?
 

ExcluZZ

Новичок
Автор оригинала: pilot911
мне кажется, идея с index.php не подойдет для административной части сайта, имхо, в ней лучше иметь один обработчик на каждый модуль
Совершенно так я и посчитал.. поэтому мой скрипт в индексе перенаправляет все запросы начинающиеся с /admin/###### в /admin/index.php
а там уже и админка)
И кстати ваши слова подкинули мне идею, вообще сделать каталог /admin/ исключением реврайта...
 

damngood

Мозг был, но ушел...
Хм, у меня даже нету каталога /admin/ он виртуальный, и не существует до тех пор (будет выдана 404 ошибка), пока пользователь не зайдет на определенный адрес и не разблокирует механизм авторизации, чтобы ввести логин и пароль. Сделано так для того, чтобы умники всякие не ломились на /admin/ и не пытались там что-либо *хакнуть*
 

ExcluZZ

Новичок
пока моими заказами являются не большие сайты или порталы, а средние сайты компаний.. строительные и т.п. и нет необходимости в суперзащите, но в будущем может стать необходимостью.. пока я отложу этот вопрос и перейду к следующему, более волнующему меня, никак не могу определиться...
как лучше искать строчку запрашиваемого раздела в бд? хранить поле с полным адресом? и искать по этому полю совпадение с реквест_урл
например в специальный ячейках хранить:
/stateiki/
/stateiki/plushki/
/stateiki/plushki/sizumom/
/stateiki/plushki/smakom/
/stateiki/plushki/skotyatami/
в этом случае ничего сложного, ищешь сразу в бд значение текущего реквест_урл, но возникает сложность переименовать раздел, например если я хочу вместо "plushki" написать "bulochki", это сколько ж прийдется строк переписать.. с другой стороны вообще нужна ли будет такая необходимость когда-нибудь в переименовании..

есть конечно другой вариант, писать в этой ячейке конечное название раздела, а в другой ячеке хранить номер родительского раздела, вот только тогда прописывать целый механизм для определения строки..

мне кажется меня очень трудно понять)) если кто-то что-то понял выскажитесь, как это обычно делают, как удобнее..
 

damngood

Мозг был, но ушел...
ExcluZZ
прекрасно тебя можно понять. Храни структуру id-parentid и пиши код, который построит тебе дерево разделов из содержимого таблицы адресов. У меня во всяком случае сделано именно так и кучи строк я не переписываю, если мне надо один раздел перенести в другую ветку, вместе с его дочерними подразделами.

В итоге после запросов к БД и вычисления карты сайта я имею массив в виде:

id => path, то есть:
1 => /stateiki/
2 => /stateiki/plushki/
...

В итоге сравнив запрос с содержимым массива и если он найден я сразу знаю какой раздел будем показывать, например раздел с id = 2 то есть /stateiki/plushki/

Это в общих словах. Поищи по форуму я уже описывал как это было у меня реализовано.
 

damngood

Мозг был, но ушел...
http://phpclub.ru/talk/showthread.php?s=&threadid=116904

Вот эта тема, о которой я говорил
 

ExcluZZ

Новичок
Огромное спасибо за ссылку, много полезного, разжую инфу буду следующие вопросы выяснять)

-~{}~ 12.12.09 18:38:

Разбираясь с реврайтом и организацией структуры задумался над своей кодировкой, как у многих она всегда была cp1251, нашел много разных статей и везде трындят об однозначном превосходстве utf8, а вы какой пользуетесь, с этой кодировкой можно и русские директивы использовать в адресной строке, в реквест_урл правда адрес появляется в закодированном виде, но он легко декодируется функцией urldecode.

Кто какой кодировкой пользуется и насколько корректно адреса русские использовать в адресной строке?
 

damngood

Мозг был, но ушел...
ExcluZZ
Русские адреса "некорректно" использовать в адресной строке, потому как твоя абракадабра банально будет некрасива) Лучще латиницу, не придется гонять данные на перекодировку и сразу будешь видеть что у тебя за адрес. А кодировку лично для себя в давно выбрал и это однозначно utf8, все данные храню в ней.
 

Духовность™

Продвинутый новичок
Русские адреса "некорректно" использовать в адресной строке, потому как твоя абракадабра банально будет некрасива)
вспомнился магазин Храка: http://voopy.com.ua/ru/search/Пингвин

посмотри, как это выглядит в адресной строке
 

ExcluZZ

Новичок
у меня выглядит вот так... http://voopy.com.ua/ru/search/Пингвин

а вот моя тестовая страничка на которой я пробую русский в адресной строке:
http://cms.megasaratov.ru/
почему абракадабра? или не у всех так видно адреса?
http://cms.megasaratov.ru/о_комрании/
http://cms.megasaratov.ru/партнеры/

-~{}~ 13.12.09 12:32:

при таком раскладе можно будет использовать и русские и латинские адреса.. уже на выбор заказчика..
а данные из реквест_урл наверника и так придется гонять, т.к. в некоторых модулях наверника придется использовать еще переменные в адресной строке.. например:
http://blabla.ru/news/?month=11&day22
и для того чтобы найти эту страницу в структуре, приедется обрезать до /news/
 
Сверху