Чпу своїми руками (php)

Розроблено досить багато способів створення ЧПУ:

  • mod_rewrite - часто використовувана технологія. Ідея полягає в установці спецового модуля до Апач і додаванню правил для перетворення короткого урла в повний в файл .htaccess RewriteRule ^ (# 91; ^ / # 93; *) \. Rss /rss.php?type=$1 # 91; L # 93;

    +. досить простий в реалізації метод - накатав в .htaccess правила і все тут

    -: Треба, щоб на сервері був встановлений власне mod_rewrite, при об'ємні сайті - накопичення правил в .htaccess

  • FileMatch - Заснований на директиві FilesMatch, яка в Апачі є core feature. Все просто. Пишемо знову ж в .htaccess

    Action throw /index.php
    ForceType throw


    ForceType application / x-httpd-php

    Ці директиви будуть перенаправляти всі запити. що не містять точки. на index.php. Далі розібрати запит - не особливо складно.

    +: Та ж простота в реалізації

    -: Треба, щоб на сервері був встановлений модуль mod_action

  • ErrorDocument - заснований на Деректіву в .htaccess файлі для перекидання запитів з неіснуючих урли на вказаний файл. Для цього в .htaccess треба додати:
  • ErrorDocument 404 /index.php ErrorDocument 401 /index.php

    +: ИМХО найпростіший спосіб, нічого встановлювати на сервері не треба, в індексі отримав запит. обробив і радієш

    -: На сервері в логах накопичується повідомлення про 404 урлах. треба відключати логирование таких помилок.

    Ще варто сказати, що навіть після перенаправлення запиту з неіснуючого урла на існуючий файл, сервер покаже потрібну сторінку, але все рівно поверне стаату 404 для цієї сторінки. Щоб цього не було - треба вначало index.php додати header ( "http / 1.0 200 Ok");

    Упевнений, що є ще безліч методів, але ми обмежимося цими.

    У моєму випадку перший спосіб брати сенсу не було. незрозуміло чи буде на сервері у хостера стояти mod_rewrite (хоча зазвичай коштує;)). Другий - у мене не заробив. навіть не знаю чому; (Залишився третій спосіб. Він якраз заробив як треба. Вся складність полягала в перетворенні ЧПУ-шного урла і звичайний і навпаки. CMS Joomla (і багато інших мабуть) використовують для цих цілей базу даних і динамічно генерує нові урли . Мну це не пре. бо попрацювавши з тієї ж джумла переконався, що левова частка часу формування сторінки йде на формування і пошук цих урлов в БД. Хотілося знайти рішення без баз даних, і я його знайшов. Суть полягає в наборі правил виду:

    Для обробки таких урлов я написав спецовий клас (сам клас і файли прикладів можна знайти вкінці статті). Розбирати сам клас ми не будемо, а посомтрім способи його пріміненія на прикладах.

  • Підключення та використання ЧПУ на сайті $ links = new Links ($ url, $ use_ufu); // $ url - назва сайту. Більшатиме до посилаючись при генерації, $ use_ufu (0 \ 1) - використовувати ЧПУ чи ні
    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 =?");

  • Розбір ЧПУ-шного урла і формування GET запиту if (isset ($ _ SERVER # 91; 'REDIRECT_STATUS' # 93;) $ _SERVER # 91; 'REDIRECT_STATUS' # 93; == '404') $ url = $ _ SERVER # 91; 'REQUEST_URI' # 93 ;;
    if (! $ links-> parseURL ($ url)) // error 404;
    die ( 'Sorry, page not found' ');
    >
    >
    print_r ($ _ GET);

    Якщо все пройшло добре - в масив $ _GET будуть додані змінні, які б використовувалися при звичайному запиті. Слід сказати, що запит повинен бути виду / pages / 2 ю Слід також вказати, що можна вказувати змінні, які не визначені в правилах як в звичайному запиті / pages / 2? Foo = 5

  • Генерація ЧПУ зі звичайного запиту
  • $ Links-> createUFU ( 'index.php? Do = pages');
    // результат: site.com/pages/

    Я звичайно розумію, що спосіб не є універсальним, зате він досить простий в реалізації, просто в застосуванні.

    У будь-якому випадку буду вдячний за будь-які коментарі \ критику, оскільки вони можуть допомогти вдосконалити код \ метод \ спосіб;)

    TODO: Зараз ЧПУ-шний урл формується з'єднанням значень зі звичайного урла за допомогою "/". Надалі планую прибрати прив'язку до порядку проходження змінних в звичайному урле.

    Клас і приклади лежать тут.

    UPD: більш адекватний метод описаний в статті ЧПУ своїми

    руками (PHP). Зберігання ЧПУ в базі даних

    Вобще, спасибі за статтю, раніше пробував через .htaccess але не виходило, зараз буду пробувати через твій клас)))

    Пробуйте, відпишіться як все пройшло.

    ЗИ: я зараз пишу ще одну статтю по ЧПУ (яка розкриває принцип незалежних від системи ЧПУ.).

    ЗИИ: В описаній технології (а саме ErrorDocument 404 /index.php) є істотний недолік - неможливість обробити пост дані. Тому раджу все таки використовувати мод реврайт для перенаправлення всіх запитів на індексну сторінку.

    Спосіб приймається, хоча.

    що отримуємо в $ _SERVER [ "REQUEST_URI"]? Рядок виду: /? / News / 2.

    Єдиний недолік - знак питання. Плюси: нічого на сервер не ставимо. htaccess і логи не чіпаємо.

    имхо простіше і краще поставити в .htaccess реврайн на індекс (саме реврайн, не директор індекс). Так логи теж не будуть засмічуватися. А ось знак питання в урле - особисто мені не подобається =)

    зи% є ще варіант зберігати урли в базі даних, як це робить та сама джумла (точніше SEF), але цей варіант підходити ток для невеликих сайтів.

    цей, і ще пару варіантів я як нитка опишу в статті. хай ток час з'явиться =)

    А ще краще використовуват патерн маршрутизатора, Який фільтрує передаваємі параметри через preg_match, такий як Використана в ZendFramework

    Схожі статті