За последние 24 часа нас посетили 22675 программистов и 1208 роботов. Сейчас ищут 752 программиста ...

mod_rewrite. Помогите сделать ЧПУ

Тема в разделе "PHP для новичков", создана пользователем Zasadaa, 10 июл 2020.

  1. Zasadaa

    Zasadaa Активный пользователь

    С нами с:
    16 дек 2010
    Сообщения:
    106
    Симпатии:
    1
    Здравствуйте уважаемые разработчики! Хочу сделать ЧПУ, но не могу понять как. Что-то до меня не доходит. Есть страницы site.ru/category/cosmos/index.php?id=1 хочу следующее:

    site.ru/category/cosmos/index.php?id=1 преобразовать в site.ru/category/cosmos/1 или site.ru/cosmos/1
    site.ru/category/cosmos/index.php?id=2 преобразовать в site.ru/category/cosmos/2 или site.ru/cosmos/2
    site.ru/category/cosmos/index.php?id=3 преобразовать в site.ru/category/cosmos/3 или site.ru/cosmos/3
    site.ru/category/cosmos/index.php?id=4 преобразовать в site.ru/category/cosmos/4 или site.ru/cosmos/4
    site.ru/category/cosmos/index.php?id=5 преобразовать в site.ru/category/cosmos/5 или site.ru/cosmos/5

    И так далее...

    Буду очень благодарен за помощь. Спасибо.
     
  2. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    Чпу предполагает единую точку входа. странно что она у вас лежит в категориях космоса.
    Создайте папку public. Туда запихните index.php, js, css, image и прочее.
    Создайте .htaccess и туда путь из корня сайта к index.php, например так:
    Код (Text):
    1. RewriteEngine on
    2. RewriteRule ^$ public/ [L]
    3. RewriteRule ^(.*) public/$1 [L]
    Создайте папку app, там фаил router.php и подключите его в index.php.
    И пишите там свои роуты cosmos/1

    Если разберетесь с композером:
    PHP:
    1. $app->group('/cosmos', function (Group $group) {
    2.         $group->get('', CosmosAction::class);
    3.         $group->get('/{id}', IdCosmosAction::class);
    4. });
    а если не разберетесь то придется такой велосипед делать)
    https://www.programulin.ru/chpu-routing-edinaya-tochka-vhoda-na-php
     
    #2 Artur_hopf, 10 июл 2020
    Последнее редактирование: 10 июл 2020
  3. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    Не предполагает. Но сильно рекомендуется использовать единую точку входа, чтобы не городить костыли.

    И рерайт в public – это заглушка для тупых. Ты же не тупой. Нафиг это выкладывать? Лучше бы показал основной рерайт, т.е. непосредственно в единую точку входа, а не в ХЗ что.
    --- Добавлено ---
    @Zasadaa, что обозначают циферки? Подкатегории? Или материалы категорий?
     
    #3 miketomlin, 10 июл 2020
    Последнее редактирование: 10 июл 2020
  4. Zasadaa

    Zasadaa Активный пользователь

    С нами с:
    16 дек 2010
    Сообщения:
    106
    Симпатии:
    1
    @miketomlin, немного переделал есть вот это:
    site.ru/kosmos.php?id=1 преобразовать в site.ru/kosmos/1 хотя бы так. Цифры обозначают статью раздела. В данном случае kosmos - это раздел, а цифра 1 - это первая статья
    --- Добавлено ---
    Есть еще другие разделы и в каждом из них много статей.

    Мне бы чем проще тем лучше. Спасибо
     
    #4 Zasadaa, 10 июл 2020
    Последнее редактирование: 10 июл 2020
  5. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    Готовый фронт-контроллер с автовыборкой данных (MySQL): https://gency.ru/comment/127

    Если нумерация статей общая для всех разделов (т.е. они хранятся в одной таблице), нужно создать представления БД для каждого раздела, чтобы можно было использовать автовыборку, например:
    Код (Text):
    1. CREATE ALGORITHM=MERGE VIEW `site_kosmos` AS
    2.   SELECT * FROM `site_articles` WHERE `category`=1;
    Или написать выборку из таблицы статей по полю category вручную, например:
    PHP:
    1. if (strlen($p1))
    2. {
    3.   if (!($result=mysqli_query($link,"SELECT * FROM `site_articles` WHERE `category`={$page['category']} AND `id`='$p1'")))
    4.   {
    5.     error(503);
    6.     return;
    7.   }
    8.  
    9.   $r1=mysqli_fetch_assoc($result);
    10.   mysqli_free_result($result);
    11.  
    12.   if (!($r1))
    13.   {
    14.     error(404);
    15.     return;
    16.   }
    17.  
    18.   $page=&$r1;
    19. }
    P.S. Вообще при использовании общей таблицы статей проще делать так:
    [/category]/kosmos и /articles/1, т.е. в адресах статей использовать обобщенный слаг и в адресах категорий, возможно, тоже.

    P.P.S. Если до сих пор не поняли, использовать по полной mod_rewrite для ЧПУ – это прошлый век. Вам нужен только один рерайт, в единую точку входа. Пример тут (вам выше уже давали ссылку на подобную статью).
     
    #5 miketomlin, 10 июл 2020
    Последнее редактирование: 11 июл 2020