Здравствуйте, мастера. Поставил задачу - переписать немного свой скрипт. У меня сейчас есть база пользователей, и вывод их персональной информации производится путём переходе по ссылке, вида: /user.php?id={$n} получилось сделать, чтобы было вида: /id{$n} Но как можно сделать, чтобы выводило, по типу: /mylogin Я так понял, что в .htaccess настроить: RewriteRule ^/([a-zA-Z0-9]*)$ /profile.php?login=$1 [L,QSA] Но я что-то засомневался в этом. id то он всегда уникальный, фильтровать просто, и проблем не возникнет в случае чего. А вот за логин я переживаю, что туда можно всего напихать ненужного. Или, к примеру, статьи в блоге, привоя к читабельному виду, как сделать. С этим ещё сложнее, особенно, если название на русском. Заменить русские на английские, это функция несколько строк. Но надежность меня беспокоит. И какова вероятность, что пользователи будут попадать не туда? Задайте вектор нужного направления пожалуйста) А то я уже извёлся весь)
Посмотри на готовые PHP Router, сделай свой или используй готовый, там по гибче и удобнее. Сам .htaccess будет очень простым PHP: Options +FollowSymLinks IndexIgnore */* RewriteEngine on # if a directory or a file exists, use it directly RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # otherwise forward it to index.php RewriteRule . index.php Двигайся к MVC. С единой точкой входа.
мое было решение такого ( меньше кода / простота ): .htaccess Код (Text): AddDefaultCharset UTF-8 RewriteEngine On RewriteRule ^$ /index.php [L,QSA] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-s RewriteRule ^(.*)$ /index.php [L,QSA] Дальше отлавливал URL функцией PHP: public static function loadDir( $URI = FALSE ) { $HOBOSTI = array (); $START_INDEX = ( !empty ( $URI[0] ) ? trim ( $URI[0] ) : Core::SET['START_DEFAULT_INDEX'] ); $HOBOSTI['TITLE'][] = array ( "Главная страница", "/" ); if ( file_exists ( dirname ( __FILE__ ) . "/startindex/wom-{$START_INDEX}-inc.php" ) ) { require ( dirname ( __FILE__ ) . "/startindex/wom-{$START_INDEX}-inc.php" ); return $HOBOSTI; } else { require ( dirname ( dirname ( __FILE__ ) ) . "/views/error/404.php" ); return $HOBOSTI; } } и кончено запуск этой функции был таков: PHP: $HOBOSTI = Core::loadDir( explode ( '/', mb_strtolower ( trim ( parse_url ( $_SERVER['REQUEST_URI'], PHP_URL_PATH ), ' /' ), 'UTF-8' ) ) ); И осталось лишь разобраться в моем Г.коде, что и как / какая инфа выходит, а выходит из $HOBOSTI PHP: $HOBOSTI = array ( 'TITLE' => титл , 'BODY' => содержимое )
@Magnum, можно различать слаг и логин. Большие буквы лучше не использовать в адресе, как и кириллицу (можете предлагать слаг, являющийся транслитом кириллического логина/имени).
допустим - ввожу свой сайт example.test/forum/newthread функция ищет скрипт /startindex/wom-forum-inc.php Дальше все остальное попадает в переменную $URI: PHP: $URI = array ( 0 => 'forum', 1 => 'newthread' ) Следовательно в скрипте wom-forum-inc.php производим манипуляции по вкусу ( по условию ) PHP: class MouseForum { public static $START_INDEX; public static $SUB_TOP; public static $NUMBER; public static $PG; public static function init( $START_INDEX, $URI = FALSE ) { self::$START_INDEX = $START_INDEX; self::$SUB_TOP = ( !empty ( $URI[1] ) ? mb_strtolower ( $URI[1], 'UTF-8' ) : FALSE ); self::$NUMBER = ( !empty ( $URI[2] ) ? mb_strtolower ( $URI[2], 'UTF-8' ) : FALSE ); self::$PG = ( !empty ( $URI[3] ) ? mb_strtolower ( $URI[3], 'UTF-8' ) : FALSE ); } } MouseForum::init( $START_INDEX, $URI ); //$START_INDEX = forum, $URI = forum , ну и далее.. все в array if ( MouseForum::$SUB_TOP == 'newthread' ) // наше "по вкусу" по условию { $HOBOSTI = //крч вывод содержимого без array / сам массив в дальнейшем учтен ( если ЧО ) }
@Magnum, еще если просто идентифицировать тип страниц по началу адреса /id, потом случайно создадите др. страницу с подобным адресом и будете ломать голову, почему она не работает, хотя конечно можно более строгую маску определить, чем просто совпадение по началу. Лучше создавать страницы пользователей, как и любые другие, сохраняя для них слаги idNNN и закрепляя за ними нужный обработчик. Либо сделать формат адреса более сложным, например /user/{слаг или числовой id}. --- Добавлено --- @MAN_IFE_ST, не понял, но раз он так легко ломается, может, это к лучшему
не вовремя ты свой пост оставил а точно.. во функции loadDir PHP: $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
ОК, в след. раз буду у вас разрешение спрашивать, прежде чем что-то запостить. Может, лучше делать редирект с нормализацией, например: http://g09.ru///ArTiClEs///My-First-Article///
@MAN_IFE_ST, а зачем нужна эта строка: Код (Text): RewriteRule ^$ /index.php [L,QSA] Чтобы лишних условий не проверять что ли? Может, проще от нек. из них совсем избавиться, например оставить только с «!-f»? P.S. Когда вы в правиле не касаетесь GET-параметров, QSA без надобности.
эээээмммм. А? Что? QSA лепит строку запроса оригинальную, если таковая была. К обработке правилом отношение имеет косвенное - правило может на рерайте придумать свою строку аргументов, а тут на тебе - еще и оригинальную приклеивают.
@Ganzal, я имел в виду, что если вы в правиле не лепете своих параметров, QSA дефолтом будет действовать, т.е. строка параметров будет наследоваться.
Подниму тему, только не уверен, что кто-то прочитает) Сделал чпу-ссылки, такого вида: http://portfolio/cat/wap-pda-dizayny.16/qwerqwerqwer.1 Нормально ли это, что я пишу и id категории и id работы?