LINUX.ORG.RU

Человеко-понятные урлы и их «роутинг»


0

0

Пишу движок для сайта, одно из требований клиента - отсутствие $_GET в строке запроса. Обычно такое достигается путём записи всех правил в виде регулярных выражений и "примерке" урла к каждому из них, но мне такое решение не нравится: у сайта сложная иерархия, и проходить пару десятков регулярных выражений при каждой загрузке страницы не хочется. Как бы поступить? Думаю создавать в файловой системе папки, например, для урла www.example.com/files/something/2/ будет обработан файл routes/files/default.php, содержащий регулярные выражения для папки files.

слово mod_rewrite Вам ничего не говорит ?
тогда не надо было браться за "движок для сайта" :)

MKuznetsov ★★★★★
()

> Как бы поступить?

Использовать Django?

putpixel
()
Ответ на: комментарий от MKuznetsov

mod_rewrite уже используется. Я говорю о способах обработки самого урла. Django не устраивает, так как реализует роутинг простым списком регулярных выражений.

RommeDeSerieux
() автор топика
Ответ на: комментарий от RommeDeSerieux

В .htaccess пишешь

-----------------------------------
# При любой строке запроса управление передаётся в index.php
# (если только строка запроса не представляет реальный файл или каталог
# на сервере)
# а там уж REQUEST_URI парсится как угодно

# Включаем mod_rewrite
 RewriteEngine On
# Условие "строка не файл на серв."
 RewriteCond %{REQUEST_FILENAME} !-f
# Условие "строка не каталог на с."
 RewriteCond %{REQUEST_FILENAME} !-d
# Перенаправление в index.php если два верхних условия прошли
 RewriteRule ^(.*)$ index.php [L,QSA]
---------------------------------------

Дальше просто в index.php парсишь $_SERVER['REQUEST_URI'] как тебе хочется.

p.s. про джангу народ не слушай. Этому монстру место там, где он находится, то есть в Zope.

r_asian ★☆☆
()
Ответ на: комментарий от r_asian

Все остальные правила mod_rewrite из .htaccess можешь смело убирать

r_asian ★☆☆
()
Ответ на: комментарий от r_asian

> Этому монстру место там, где он находится, то есть в Zope.

С Plone путаешь?

Sphinx ★★☆☆
()
Ответ на: комментарий от r_asian

Я же сказал, что меня интересуют именно способы распарсивания урла, а не способы его передачи в php. Теперь не читают не только новости, но и посты?

RommeDeSerieux
() автор топика
Ответ на: комментарий от RommeDeSerieux

В django урл парсится вот так:

urlpatterns = patterns('',
    (r'^now/$', current_datetime),
    (r'^now/plus(\d{1,2})hours/$', hours_ahead)
)

Но у меня сомнения насчёт производительности 
данного подхода и его дружественности к модульным 
системам.

RommeDeSerieux
() автор топика
Ответ на: комментарий от RommeDeSerieux

> Я же сказал, что меня интересуют именно способы распарсивания урла, а не способы его передачи в php

Дык из костыля, который ты написал вначале как раз и следовало что, что у тебя не выходит с "универсальной обработкой".

А распарсить это как раз и наименьшая из проблем. В меру испорченности, конечно. Хочешь - через explode, а хочешь через preg_match_all :-), а ещё мне как то попадался код, где автор в цикле через str_pos искал очередное первое вхождение "/", читал то что идет до него, и обрезал, и так несколько раз :-)

r_asian ★☆☆
()

Применение регулярных выражений имеет вычислительную сложность O(N). Поэтому можно смело считать, что в контексте парсирования URL-ов они дармовые, особенно если обработчик - на PHP. Если в нем еще есть обращение к RDBMS - так вообще даже не парься.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.