Моя реализация ЧПУ

Нашёл на одном из блогов реализацию ЧПУ и решил внести свою лепту. ЧПУ — человеко понятный урл. На аглийском наиболее популярное название User Friendly URL. С какого-то перепугу разработчики решили, что стандартный урл с гет переменными непонятен и покатилось. Сначала сравним варианты для вывода списка новостей категории test отсортированного по date:
news.php?category=test&sort=date — стандартный подход, вроде всё понятно ключ=значение
news/category/test/sort/date/ — если убрать выделение, то не понятно где ключ, а где значение
news/test/date/ кратко, но довольно путано, обязательный порадок, трудно изменять
news/category:test/sort:date/ — этот вариант хорош, так же нагляден как класика и даже чуть короче
news.test.date — краткий, но не информативный, есть один плюс — такие страницы без тайтла сохраняются с нормальным названием.

Теперь рассмотрим классический разбор: через mod_rewrite apache пересылаем запрос на index.php, а там уже разбираем с помощью php. Разбор в самом mode_rewrite не очень хорошая идея, так как постоянно нужно модифицировать .htaccess. Самое популярное правило:

.htaccess ложится в корень сайта и прописывается (код из wordpress)
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

Сразу проверка есть ли модуль, а дальше если нет файла или директории с указаным адрессом, то пересылаем на index.php, а там разбираем $_SERVER[«REQUEST_URI»]. У правила есть один огромный недостаток — разработчики постоянно забывают, что браузер запрашивает кроме страницы favicon.ico — для маленькой иконки в названии сайта. И если такого файла нету, то на index.php посылается и этот запрос, тем самым нагрузка удваивается. Вторая проблема — создал папку с названием модуля и всё, накрылся реврайт.

Я учёл эти проблемы и запихнул всё что должно быть доступно из вне в папку public, а затем для неё и favicon.ico отключил реврайт.

RewriteEngine on
RewriteRule !^(public/|favicon\.ico) index.php [L]

Ну а дальше по отработанной схеме. Из недостатков — ограничение на название public. Из плюсов — теперь только в публик можно не придерживаться ЧПУ фреймворка, например, tinymce в папке public может использовать урлы с гет переменными, а если перенести за пределы, то всё будет работать через единую точку входа.

Моя реализация ЧПУ: 5 комментариев

  1. neolord

    Это чтоб дописывал слеш в конце (для унификации урлов)
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)([^/]{1})$ http://%{HTTP_HOST}/$1$2/ [R=301,L]

    А это разбирает урл на папочки
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^([^/]+)/([^/]*)$ index.php?mode=url&node[]=$1 [QSA]

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/([^/]+)/$ $1/?node[]=$2 [NE,QSA]

    И все, htaccess модифицировать не придется, а гибкость больше (легче делать редиректы неправильных урлов на правильные). Да и по быстродействию этот способ побыстрее на коротких урлах (если считать верификацию маски пути)

    Условия на папку/файл можно убрать, просто я считаю что реальный файл должен быть приоритетней виртуального

  2. kelvin

    по мне так лучше mod rewrite
    переписывать придется стольео же раз, сколько пришлось бы править php, да и нагрузки меньше + можно отфильтровать get данные прямо сервером не доходя до скрипта, а это дополнительная безопасность. т.е напимер в isers/id/
    вместо id не смогут подставить что-то кроме цифр.

    1. admin Автор записи

      так php код вовсе не придётся править.
      $r = new Request(‘news/list/sort:date/’);
      $r->getController() — news
      $r->getAction() — list
      $r->getParam(‘sort’) — date
      $r = new Request(‘news/list/page:2/sort:date/’);
      $->getParam(‘sort’) — sort
      $r->getParamInd(‘page’) — 2
      а регулярку бы каждый раз пришлось переписывать, а так же следить за форматом.

  3. Aravak

    Я тоже делал через одну точку входа, мне так удобно, правда я еще mysql приплел — http://js-php.ru/web-development/apache-mod_rewrite-php-mysql/

    Неплохо кстати это дело в симфони организовано, там тоже вроде все через одну точку входа, но настройки лежат в ymml формате, все никак руки до него не дойдут, что за формат такой :)

  4. LIAISERES

    ronco 6000 pro [url=http://mientkabrett.narod.ru/Love-seks-znakomstva.html]Love секс знакомства[/url] [url=http://mientkabrett.narod.ru/Seks-znakomstva-v-ekaterinburge-besplatno.html]Секс знакомства в екатеринбурге бесплатно[/url] [url=http://mientkabrett.narod.ru/Seks-znakomstva-pikalevo.html]Секс знакомства пикалево[/url] what say you movie [url=http://mientkabrett.narod.ru/Seks-znakomstva-v-tveri-besplatno.html]Секс знакомства в твери бесплатно[/url] [url=http://mientkabrett.narod.ru/Seks-znakomstva.html]Секс знакомства[/url] [url=http://daluzmyrna.narod.ru/Seks-znakomstva-pskov.html]Секс знакомства псков[/url] true blood hbo 2010 [url=http://mientkabrett.narod.ru/Seks-znakomstva-v-viborge.html]Секс знакомства в выборге[/url] [url=http://mientkabrett.narod.ru/Seks-znakomstva-ryazan-bez-registracii.html]Секс знакомства рязань без регистрации[/url] [url=http://daluzmyrna.narod.ru/Seks-znakomstva-v-permi.html]Секс знакомства в перми[/url] peek movie [url=http://mientkabrett.narod.ru/Seks-znakomstva-axtirka.html]Секс знакомства ахтырка[/url] [url=http://shamsgraeme.narod.ru/Seks-znakomstva-besplatno-mariupol.html]Секс знакомства бесплатно мариуполь[/url] [url=http://daluzmyrna.narod.ru/Sajt-seks-znakomstv-penza.html]Сайт секс знакомств пенза[/url] presense music [url=http://shamsgraeme.narod.ru/Sajt-seks-znakomstv-izhevsk.html]Сайт секс знакомств ижевск[/url] [url=http://mientkabrett.narod.ru/Znakomstva-seks-perepiska.html]Знакомства секс переписка[/url] [url=http://daluzmyrna.narod.ru/Razvratnie-seks-znakomstva.html]Развратные секс знакомства[/url] creating games on-line [url=http://mientkabrett.narod.ru/Seks-znakomstva-v-eliste.html]Секс знакомства в элисте[/url] [url=http://mientkabrett.narod.ru/Znakomstva-dlya-vzroslix-xxx.html]Знакомства для взрослых ххх[/url] [url=http://shamsgraeme.narod.ru/Kizilorda-seks-znakomstva.html]Кызылорда секс знакомства[/url] bellmont drive-in movies charlotte nc [url=http://shamsgraeme.narod.ru/Seks-znakomstva-v-kontakte.html]Секс знакомства в контакте[/url] [url=http://shamsgraeme.narod.ru/Seks-znakomstva-so-studentkami.html]Секс знакомства со студентками[/url] [url=http://mientkabrett.narod.ru/Seks-znakomstva-kolpino.html]Секс знакомства колпино[/url] 2007 porno movies [url=http://shamsgraeme.narod.ru/Seks-znakomstva-slavgorod.html]Секс знакомства славгород[/url] [url=http://mientkabrett.narod.ru/Besplatnie-seks-znakomstva-v-kolomne.html]Бесплатные секс знакомства в коломне[/url] [url=http://shamsgraeme.narod.ru/Seks-znakomstva-g-krasnodara.html]Секс знакомства г краснодара[/url] ribbed music for the [url=http://daluzmyrna.narod.ru/Seks-znakomstva-g-moskva.html]Секс знакомства г москва[/url] [url=http://shamsgraeme.narod.ru/Seks-znakomstva-v-altajskom-krae.html]Секс знакомства в алтайском крае[/url] [url=http://mientkabrett.narod.ru/Seks-znakomstva-besplatno-v-voronezhe.html]Секс знакомства бесплатно в воронеже[/url] ncaa final four music [url=http://daluzmyrna.narod.ru/Besplatnie-seks-znakomstva-bez-regestracii.html]Бесплатные секс знакомства без регестрации[/url] [url=http://shamsgraeme.narod.ru/Seks-znakomstvo-v-rogatini.html]Секс знакомство в рогатині[/url] [url=http://mientkabrett.narod.ru/Seks-znakomstva-leninogorsk.html]Секс знакомства лениногорск[/url]

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *