Самая лучшая реализация ЧПУ, посоветуйте.

VBart

Новичок
Самая лучшая реализация ЧПУ, посоветуйте.

1) Action throw /index.php
<FilesMatch "_условие_">
ForceType throw
</FilesMatch>
в index.php разбираем запрос.
2) Также только через mod_rewrite.
3) Запрос разбираем не в php а в mod_rewrite... через множество RewriteRule.

Какой метод предпочтительнее и почему?
 

SiMM

Новичок
Забыли ещё Options +MultiViews (обработка 404 отметается сразу)
 

crocodile2u

http://vbolshov.org.ru
VBart
Твой вопрос просто некорректно задан. Любой из этих подходов может оказаться предпочтительнее остальных для определенной задачи (но конкретной! - а не просто "построить абстрактные ЧПУ").
 

Alkeeper

Новичок
Не знаю как с Action throw - не проверял, а вот с редиректом на ошибки не передаются данные POST при указании в качестве action чего-то такого "/path/to/folder/"

Пользуюсь обычным мод_рерайтом + класс для работы с урлами.
 

Фанат

oncle terrible
Команда форума
нет ни одной причины передавать данные POST на "чего-то такое" так что это - не проблема.
 

VBart

Новичок
Автор оригинала: crocodile2u
VBart
Твой вопрос просто некорректно задан. Любой из этих подходов может оказаться предпочтительнее остальных для определенной задачи (но конкретной! - а не просто "построить абстрактные ЧПУ").
Вот мне и хотелось бы услышать плюсы и минусы от людей, которые, используют тот или иной подход. Специфика, гибкость и неудобства? Прав ли я в том, что в самом первом посте расположил их в порядке убывания производительности?

-~{}~ 06.03.06 16:11:

Автор оригинала: Фанат
нет ни одной причины передавать данные POST на "чего-то такое" так что это - не проблема.
Но и нет причин использовать 404 метод... особено при наличии других. К тому же захламляет логи.
 

crocodile2u

http://vbolshov.org.ru
VBart
Я до сих пор тебя не понимаю. Что конкретно ты хочешь реализовать? Для чего тебе ЧПУ?

Поясню на примере...
Допустим, есть лента новостей и ты хочешь урлы такого вида:

/news/yy/mm/dd/

По-моему, в таком случае лучший вариант - mod_rewrite

А если ты хочешь все запросы ловить в, скажем, индекс.пхп - так какая, собсно, разница, как ты это организуешь? mod_rewrite установлен практически у всех, у кого вообще установлен апач. FilesMatch вобще не требует никаких доп. модулей. делай как хочешь - нет "лучшего" решения - есть более подходящее.
 

VBart

Новичок
crocodile2u
Ясное дело, что можно любым способом, просто хотелось бы для себя подобрать самый оптимальный с точки зрения производительности и гибкости. А для этого не лишним будет узнать все подводные камни, каждого из методов. Но похоже вы правы - как удобней так и буду делать.

mod_rewrite мне не нравится по двум причинам:
1) Довольно медленный, особенно в .htaccess (что и предполагается)
2) В случае использования его для разбирания URL - решение представляется мне менее гибким. А использовать просто для перенаправления запросов на PHP скрипт не имеет смысла ввиду пункта 1 и существования более быстрых альтернативных методов (FilesMatch, например).

Все дело в том, что нет опыта работы с mod_rewrite, поэтому возможно я ошибаюсь, вот и обратился за советом… Ведь везде где упоминают ЧПУ - советуют в первую очередь именно mod_rewrite.

А задача у меня - полностью переписать "движок" одного не маленького сайта. Сотни страниц и тысячи картинок, достаточно много будет динамики. Практически все будет храниться в БД и управляться собственной CMS.

Сразу решил заложить ЧПУ еще на этапе проектирования. Вот и задался вопросом, а кто как делает? Как гибче, как быстрее, а как проще?

-~{}~ 06.03.06 19:29:

Нда... что-то я действительно слишком заморачиваюсь. Пока остановился на FilesMatch, а там виднее будет.
 

GameMAN

Новичок
Определённо mod_re, вот отрывок моего gameportal.com.ru:

DirectoryIndex index.php

<IfModule mod_rewrite.c>
RewriteEngine On
# главная
RewriteRule ^([_0-9a-z-]+).htm(/?)+$ ?razdel=$1 [QSA,L]
# статьи и файлы
RewriteRule ^([_0-9a-z-]+)/([_0-9a-z-]+).htm(/?)+$ ?razdel=$1&podrazdel=$2 [QSA,L]
# статьи и файлы -> просмотр
RewriteRule ^([_0-9a-z-]+)/([_0-9a-z-]+)/([_0-9a-z-]+).htm(/?)+$ ?razdel=$1&podrazdel=$2&p=prosmotr&the=$3 [QSA,L]
</IfModule>

То есть получается, например:
news/p/simulyator_snouborda_ot_ubisoft.htm

Плюс, многие поисковики "Видят" только такие урлы: news/p/simulyator_snouborda_ot_ubisoft.htm
 

VBart

Новичок
Плюс, многие поисковики "Видят" только такие урлы
Честно говоря таких не знаю. Перечислите пожалуйста...

И я бы на вашем месте убрал данную информацию с форума, ибо можно ведь и gameportal.com.ru?razdel=../../../ написать...
 

VBart

Новичок
Я уже пробовал =)
Hack detected. Contact the support.

Просто смысл тогда разбирать урл в mod_rewrite если все равно тщательную проверку входных данных в php придется делать?
 

zerkms

TDD infected
Команда форума
Плюс, многие поисковики "Видят" только такие урлы
это действительно был плюс лет пять назад - сейчас ЧПУ несёт только эстетическую нагрузку, имхо
 

_Bill

Новичок
Красивый URL - это конечно очень актуально, но только для сайтов Canon, Microsoft и т.п. Думаю, посетители gameportal простят разработчику "билиберду" в URL. :)
 

Alkeeper

Новичок
PHP:
<?php
/*
+------------------------------------------------------------------------------+
|  URI Class v. 1.3.2 date 23.03.2006                                          |
|                                                                              |
|  Класс для работы с $_SERVER["REQUEST_URI"]                                  |
|  Когда-то где-то я видел что-то подобное и оно мне понравилось,              |
|  Но искать было лень, и потому я написал свой класс                          |
|                                                                              |
|  Made by Alkeeper (c) 2004-2006 [email protected]                                 |
+------------------------------------------------------------------------------+
*/
class URI
{
    var $displace = 0;
    var $levels   = 0;
    var $separate = array ();
    var $as_string;
/*
+------------------------------------------------------------------------------+
|  Конструктор                                                                 |
+------------------------------------------------------------------------------+
*/
    function URI()
    {
        if ($_SERVER["REQUEST_URI"] != "/")
        {
            $q = preg_replace("/(\?.+)/","",$_SERVER["REQUEST_URI"]);
            $q = trim(str_replace("/"," ",$q));
            $this->separate = explode(" ", $q);
            $this->as_string = "'".implode("','",$this->separate)."'";
            $this->levels   = count ($this->separate);
        }
    }
/*
+------------------------------------------------------------------------------+
|  Получение Всего uri, комментарии излишни                                    |
+------------------------------------------------------------------------------+
*/
    function getFull()
    {
        return $_SERVER["REQUEST_URI"];
    }
/*
+------------------------------------------------------------------------------+
|  Получение заданной части uri                                                |
|                                                                              |
|  Пример:                                                                     |
|                                                                              |
|    $_SERVER["REQUEST_URI"] = "/path/to/folder/";                             |
|    $uri = new URI;                                                           |
|    $a = $uri->get(1); // Возвращает "path"                                   |
|    $b = $uri->get(2); // Возвращает "to"                                     |
+------------------------------------------------------------------------------+
*/
    function get($ind)
    {
        $ind = $ind + $this->displace;
        if ($ind > $this->levels) return false;
        else return $this->separate[$ind-1];
    }
/*
+------------------------------------------------------------------------------+
|  Комментарий не дописан                                                      |
+------------------------------------------------------------------------------+
*/
    function getIdByElem ($path)
    {
        $ind = array_keys($this->separate,$path);
        return $ind[0]+1;
    }
/*
+------------------------------------------------------------------------------+
|  Комментарий не дописан                                                      |
+------------------------------------------------------------------------------+
*/
    function getAfter($ind)
    {
        if (is_string($ind)) $ind = $this->getIdByElem($ind);
        return array_slice($this->separate,$ind);
    }
/*
+------------------------------------------------------------------------------+
|  Комментарий не дописан                                                      |
+------------------------------------------------------------------------------+
*/
    function getBefore($ind)
    {
        if (is_string($ind)) $ind = $this->getIdByElem($ind);
        return array_slice($this->separate,0,$ind);
    }
/*
+------------------------------------------------------------------------------+
|  Комментарий не дописан                                                      |
+------------------------------------------------------------------------------+
*/
    function getTill($ind)
    {
        if (is_string($ind)) $ind = $this->getIdByElem($ind);
        return array_slice($this->separate,0,$ind+1);
    }
/*
+------------------------------------------------------------------------------+
|  Комментарий не дописан                                                      |
+------------------------------------------------------------------------------+
*/
    function getUriTill($ind)
    {
        if (is_string($ind)) $ind = $this->getIdByElem($ind);
        return "/".implode("/", array_slice($this->separate,0,$ind))."/";
    }
/*
+------------------------------------------------------------------------------+
|  Получение последней части uri                                               |
|                                                                              |
|  Пример:                                                                     |
|                                                                              |
|    $_SERVER["REQUEST_URI"] = "/path/to/folder/";                             |
|    $uri = new URI;                                                           |
|    $last = $uri->getLast(); // Возвращает "folder"                           |
+------------------------------------------------------------------------------+
*/
    function getLast ()
    {
        return $this->separate[$this->levels - 1];
    }
/*
+------------------------------------------------------------------------------+
|  Получение первой части uri                                                  |
|                                                                              |
|  Пример:                                                                     |
|                                                                              |
|    $_SERVER["REQUEST_URI"] = "/path/to/folder/";                             |
|    $uri = new URI;                                                           |
|    $last = $uri->getFirst(); // Возвращает "path"                            |
+------------------------------------------------------------------------------+
*/
    function getFirst ()
    {
        if ($this->separate) return $this->separate[0];
        else return false;
    }
/*
+------------------------------------------------------------------------------+
|  Получение части uri на $stepback уровней выше                               |
|                                                                              |
|  Пример:                                                                     |
|                                                                              |
|    $_SERVER["REQUEST_URI"] = "/path/to/folder/subfolder/file/";              |
|    $uri = new URI;                                                           |
|    $goto = $uri->getBack(3); // Возвращает "/path/to/"                       |
+------------------------------------------------------------------------------+
*/
    function getBack ($stepback)
    {
        $uri = "/";
        for ($i = 0; $i < $this->levels - $stepback; $uri .= $this->separate[$i]."/", $i++);
        return $uri;
    }
}
?>
-~{}~ 31.03.06 17:41:

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

Короче говоря, если проект относится к категории сложных или очень сложных, то ну их, эти красивости, к черту....

ИМХО.
 
Сверху