За последние 24 часа нас посетили 16113 программистов и 1547 роботов. Сейчас ищут 913 программистов ...

Ссылки с названием статьи (mod rewrite)

Тема в разделе "PHP для новичков", создана пользователем Magnum, 12 сен 2016.

  1. Magnum

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

    С нами с:
    19 июл 2015
    Сообщения:
    62
    Симпатии:
    0
    Здравствуйте, мастера.
    Поставил задачу - переписать немного свой скрипт. У меня сейчас есть база пользователей, и вывод их персональной информации производится путём переходе по ссылке, вида: /user.php?id={$n}
    получилось сделать, чтобы было вида:
    /id{$n}
    Но как можно сделать, чтобы выводило, по типу:
    /mylogin

    Я так понял, что в .htaccess настроить:
    RewriteRule ^/([a-zA-Z0-9]*)$ /profile.php?login=$1 [L,QSA]

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

    Или, к примеру, статьи в блоге, привоя к читабельному виду, как сделать. С этим ещё сложнее, особенно, если название на русском. Заменить русские на английские, это функция несколько строк. Но надежность меня беспокоит. И какова вероятность, что пользователи будут попадать не туда?
    Задайте вектор нужного направления пожалуйста) А то я уже извёлся весь)
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Посмотри на готовые PHP Router, сделай свой или используй готовый, там по гибче и удобнее.

    Сам .htaccess будет очень простым
    PHP:
    1. Options +FollowSymLinks
    2. IndexIgnore */*
    3.  
    4. RewriteEngine on
    5.  
    6. # if a directory or a file exists, use it directly
    7. RewriteCond %{REQUEST_FILENAME} !-f
    8. RewriteCond %{REQUEST_FILENAME} !-d
    9.  
    10. # otherwise forward it to index.php
    11. RewriteRule . index.php
    Двигайся к MVC. С единой точкой входа.
     
    Magnum нравится это.
  3. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.819
    Симпатии:
    1.333
    Адрес:
    Лень
    мое было решение такого ( меньше кода / простота ):

    .htaccess
    Код (Text):
    1. AddDefaultCharset UTF-8
    2. RewriteEngine On
    3.  
    4. RewriteRule ^$ /index.php [L,QSA]
    5.  
    6. RewriteCond %{REQUEST_FILENAME} !-f
    7. RewriteCond %{REQUEST_FILENAME} !-d
    8. RewriteCond %{REQUEST_FILENAME} !-s
    9. RewriteRule ^(.*)$ /index.php [L,QSA]
    Дальше отлавливал URL функцией
    PHP:
    1. public static function loadDir( $URI = FALSE )
    2.     {
    3.         $HOBOSTI = array ();
    4.         $START_INDEX = ( !empty ( $URI[0] ) ? trim ( $URI[0] ) : Core::SET['START_DEFAULT_INDEX'] );
    5.         $HOBOSTI['TITLE'][] = array ( "Главная страница", "/" );
    6.      
    7.         if ( file_exists ( dirname ( __FILE__ ) . "/startindex/wom-{$START_INDEX}-inc.php" ) )
    8.         {
    9.             require ( dirname ( __FILE__ ) . "/startindex/wom-{$START_INDEX}-inc.php" );
    10.             return $HOBOSTI;
    11.         } else {
    12.             require ( dirname ( dirname ( __FILE__ ) ) . "/views/error/404.php" );
    13.             return $HOBOSTI;
    14.         }
    15.     }

    и кончено запуск этой функции был таков:
    PHP:
    1. $HOBOSTI = Core::loadDir( explode ( '/', mb_strtolower ( trim ( parse_url ( $_SERVER['REQUEST_URI'], PHP_URL_PATH ), ' /' ), 'UTF-8' ) ) );
    И осталось лишь разобраться в моем Г.коде, что и как / какая инфа выходит, а выходит из $HOBOSTI

    PHP:
    1. $HOBOSTI = array ( 'TITLE' => титл , 'BODY' => содержимое )
     
    Magnum нравится это.
  4. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.861
    Симпатии:
    657
    @Magnum, можно различать слаг и логин. Большие буквы лучше не использовать в адресе, как и кириллицу (можете предлагать слаг, являющийся транслитом кириллического логина/имени).
     
    Magnum нравится это.
  5. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.819
    Симпатии:
    1.333
    Адрес:
    Лень
    допустим - ввожу свой сайт example.test/forum/newthread
    функция ищет скрипт /startindex/wom-forum-inc.php
    Дальше все остальное попадает в переменную $URI:
    PHP:
    1. $URI = array (
    2.     0 => 'forum',
    3.     1 => 'newthread'
    4. )

    Следовательно в скрипте wom-forum-inc.php производим манипуляции по вкусу ( по условию )
    PHP:
    1. class MouseForum
    2. {
    3.     public static $START_INDEX;
    4.     public static $SUB_TOP;
    5.     public static $NUMBER;
    6.     public static $PG;
    7.  
    8.     public static function init( $START_INDEX, $URI = FALSE )
    9.     {
    10.         self::$START_INDEX = $START_INDEX;
    11.         self::$SUB_TOP = ( !empty ( $URI[1] ) ? mb_strtolower ( $URI[1], 'UTF-8' ) : FALSE );
    12.         self::$NUMBER = ( !empty ( $URI[2] ) ? mb_strtolower ( $URI[2], 'UTF-8' ) : FALSE );
    13.         self::$PG = ( !empty ( $URI[3] ) ? mb_strtolower ( $URI[3], 'UTF-8' ) : FALSE );
    14.     }
    15. }
    16.  
    17. MouseForum::init( $START_INDEX, $URI ); //$START_INDEX = forum, $URI = forum , ну и далее.. все в array
    18.  
    19. if ( MouseForum::$SUB_TOP == 'newthread' ) // наше "по вкусу" по условию
    20. {
    21.     $HOBOSTI = //крч вывод содержимого без array / сам массив в дальнейшем учтен ( если ЧО )
    22. }
     
    Magnum нравится это.
  6. Magnum

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

    С нами с:
    19 июл 2015
    Сообщения:
    62
    Симпатии:
    0
    Спасибо за помощь)))
    --- Добавлено ---
    Буду разбираться
     
  7. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.819
    Симпатии:
    1.333
    Адрес:
    Лень
    @miketomlin бляяя :eek:мой хабрахабр сломал:D
     
  8. Magnum

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

    С нами с:
    19 июл 2015
    Сообщения:
    62
    Симпатии:
    0
    Заодно и ооп выучу :D
     
  9. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.861
    Симпатии:
    657
    @Magnum, еще если просто идентифицировать тип страниц по началу адреса /id, потом случайно создадите др. страницу с подобным адресом и будете ломать голову, почему она не работает, хотя конечно можно более строгую маску определить, чем просто совпадение по началу. Лучше создавать страницы пользователей, как и любые другие, сохраняя для них слаги idNNN и закрепляя за ними нужный обработчик. Либо сделать формат адреса более сложным, например /user/{слаг или числовой id}.
    --- Добавлено ---
    @MAN_IFE_ST, не понял, но раз он так легко ломается, может, это к лучшему :)
     
  10. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.819
    Симпатии:
    1.333
    Адрес:
    Лень
    не вовремя ты свой пост оставил :D:D

    а точно..

    во функции loadDir
    PHP:
    1. $START_INDEX = ( !empty ( $URI[0] ) ? trim ( mb_strtolower ( $URI[0], 'UTF-8' ) ) : Core::SET['START_DEFAULT_INDEX'] );
    и тогда
    МойСайт/FoRuM/NeWthREaD :)
    --- Добавлено ---
    Core::SET['START_DEFAULT_INDEX'] ну или просто 'news'. Изначальная страница стандарт - загрузка скрипта wom-имя-inc.php
     
  11. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.861
    Симпатии:
    657
    ОК, в след. раз буду у вас разрешение спрашивать, прежде чем что-то запостить.

    Может, лучше делать редирект с нормализацией, например: http://g09.ru///ArTiClEs///My-First-Article///
     
  12. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.819
    Симпатии:
    1.333
    Адрес:
    Лень
    мой колобок до такого не докатился, учту
     
  13. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    построчно объяснишь?
     
  14. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.861
    Симпатии:
    657
    @MAN_IFE_ST, а зачем нужна эта строка:
    Код (Text):
    1. RewriteRule ^$ /index.php [L,QSA]
    Чтобы лишних условий не проверять что ли? Может, проще от нек. из них совсем избавиться, например оставить только с «!-f»?

    P.S. Когда вы в правиле не касаетесь GET-параметров, QSA без надобности.
     
  15. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.819
    Симпатии:
    1.333
    Адрес:
    Лень
    Да, прикольнуло.. ок
     
  16. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    эээээмммм. А? Что? QSA лепит строку запроса оригинальную, если таковая была. К обработке правилом отношение имеет косвенное - правило может на рерайте придумать свою строку аргументов, а тут на тебе - еще и оригинальную приклеивают.
     
  17. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.861
    Симпатии:
    657
    @Ganzal, я имел в виду, что если вы в правиле не лепете своих параметров, QSA дефолтом будет действовать, т.е. строка параметров будет наследоваться.
     
  18. Magnum

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

    С нами с:
    19 июл 2015
    Сообщения:
    62
    Симпатии:
    0
    Подниму тему, только не уверен, что кто-то прочитает)
    Сделал чпу-ссылки, такого вида: http://portfolio/cat/wap-pda-dizayny.16/qwerqwerqwer.1
    Нормально ли это, что я пишу и id категории и id работы?
     
  19. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Еще как прочитают.
    Нормально. Распространенная практика.
     
    Magnum нравится это.