Розроблено досить багато способів створення ЧПУ:
+. досить простий в реалізації метод - накатав в .htaccess правила і все тут
-: Треба, щоб на сервері був встановлений власне mod_rewrite, при об'ємні сайті - накопичення правил в .htaccess
Action throw /index.php
ForceType throw
ForceType application / x-httpd-php
Ці директиви будуть перенаправляти всі запити. що не містять точки. на index.php. Далі розібрати запит - не особливо складно.
+: Та ж простота в реалізації
-: Треба, щоб на сервері був встановлений модуль mod_action
+: ИМХО найпростіший спосіб, нічого встановлювати на сервері не треба, в індексі отримав запит. обробив і радієш
-: На сервері в логах накопичується повідомлення про 404 урлах. треба відключати логирование таких помилок.
Ще варто сказати, що навіть після перенаправлення запиту з неіснуючого урла на існуючий файл, сервер покаже потрібну сторінку, але все рівно поверне стаату 404 для цієї сторінки. Щоб цього не було - треба вначало index.php додати header ( "http / 1.0 200 Ok");
Упевнений, що є ще безліч методів, але ми обмежимося цими.
У моєму випадку перший спосіб брати сенсу не було. незрозуміло чи буде на сервері у хостера стояти mod_rewrite (хоча зазвичай коштує;)). Другий - у мене не заробив. навіть не знаю чому; (Залишився третій спосіб. Він якраз заробив як треба. Вся складність полягала в перетворенні ЧПУ-шного урла і звичайний і навпаки. CMS Joomla (і багато інших мабуть) використовують для цих цілей базу даних і динамічно генерує нові урли . Мну це не пре. бо попрацювавши з тієї ж джумла переконався, що левова частка часу формування сторінки йде на формування і пошук цих урлов в БД. Хотілося знайти рішення без баз даних, і я його знайшов. Суть полягає в наборі правил виду:
Для обробки таких урлов я написав спецовий клас (сам клас і файли прикладів можна знайти вкінці статті). Розбирати сам клас ми не будемо, а посомтрім способи його пріміненія на прикладах.
if ($ use_ufu == 1) require_once ( "Links.rules.php"); // довантажувати файл з правилами
if (isset ($ linksUrls) is_array ($ linksUrls)) // якщо є масив з правилами - робимо ініціалізацію
$ Links-> init ($ linksUrls);
>
Вміст файлу Links.rules.php:
$ LinksUrls = array ();
$ LinksUrls # 91; # 93; = array ( 'news', "do =?");
$ LinksUrls # 91; # 93; = array ( 'news /?', "Do =? News_id =?");
// mod pages
$ LinksUrls # 91; # 93; = array ( 'pages', "do =?");
$ LinksUrls # 91; # 93; = array ( 'pages /?', "Do =? Pid =?");
if (! $ links-> parseURL ($ url)) // error 404;
die ( 'Sorry, page not found' ');
>
>
print_r ($ _ GET);
Якщо все пройшло добре - в масив $ _GET будуть додані змінні, які б використовувалися при звичайному запиті. Слід сказати, що запит повинен бути виду / pages / 2 ю Слід також вказати, що можна вказувати змінні, які не визначені в правилах як в звичайному запиті / pages / 2? Foo = 5
// результат: site.com/pages/
Я звичайно розумію, що спосіб не є універсальним, зате він досить простий в реалізації, просто в застосуванні.
У будь-якому випадку буду вдячний за будь-які коментарі \ критику, оскільки вони можуть допомогти вдосконалити код \ метод \ спосіб;)
TODO: Зараз ЧПУ-шний урл формується з'єднанням значень зі звичайного урла за допомогою "/". Надалі планую прибрати прив'язку до порядку проходження змінних в звичайному урле.
Клас і приклади лежать тут.
UPD: більш адекватний метод описаний в статті ЧПУ своїми
руками (PHP). Зберігання ЧПУ в базі даних
Вобще, спасибі за статтю, раніше пробував через .htaccess але не виходило, зараз буду пробувати через твій клас)))
Пробуйте, відпишіться як все пройшло.
ЗИ: я зараз пишу ще одну статтю по ЧПУ (яка розкриває принцип незалежних від системи ЧПУ.).
ЗИИ: В описаній технології (а саме ErrorDocument 404 /index.php) є істотний недолік - неможливість обробити пост дані. Тому раджу все таки використовувати мод реврайт для перенаправлення всіх запитів на індексну сторінку.
Спосіб приймається, хоча.
що отримуємо в $ _SERVER [ "REQUEST_URI"]? Рядок виду: /? / News / 2.
Єдиний недолік - знак питання. Плюси: нічого на сервер не ставимо. htaccess і логи не чіпаємо.
имхо простіше і краще поставити в .htaccess реврайн на індекс (саме реврайн, не директор індекс). Так логи теж не будуть засмічуватися. А ось знак питання в урле - особисто мені не подобається =)
зи% є ще варіант зберігати урли в базі даних, як це робить та сама джумла (точніше SEF), але цей варіант підходити ток для невеликих сайтів.
цей, і ще пару варіантів я як нитка опишу в статті. хай ток час з'явиться =)
А ще краще використовуват патерн маршрутизатора, Який фільтрує передаваємі параметри через preg_match, такий як Використана в ZendFramework