делаем ЧПУ ручкаме

1.43K
.
Привет всем , начал изучать вопрос чпу недавно, думаю все кодеры с этим рано или сталкиваются.
Начнём с термина ЧПУ-абривиатура-Человеко-понятный урл.
Веь смысл чпу заключается в том, что бы преобразовать ссылку вида: /forum.php?id=21312312
в /forum/stasik_hasker или /forum/Стасик_хацкер. Согласитесь пользователю так гораздо удобней, и воспреимчевей. Тем более поисковые системы тоже лучше воспринимают инфу в ЧПУ.
Весь этот фокус основан на .hattacess . Возмём подалуй его из одной цмс (wikimobile.su)
вот код
php_flag display_errors 1
php_value register_globals 0
php_value session.use_trans_sid 0
php_value magic_quotes_gpc 0
php_value magic_quotes_runtime 0
php_value magic_quotes_sybase 0 
php_value allow_url_fopen 1
php_value arg_separator.output "&"
DirectoryIndex index.php
AddDefaultCharset UTF-8
Options -Indexes

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^file([0-9]+)/(.*?)$ ?do=down&file=$1 [B]
RewriteRule ^cat/(.{1,200})$ razd.php?act=viewcat&name=$1 [B]
RewriteRule ^razd/(.{1,200})$ razd.php?act=viewrazd&name=$1 [B]
RewriteRule ^wiki/(.{1,200})/([0-9]+)/(.{2})$ ?wiki=$1&p=$2&lang=$3 [B]
RewriteRule ^wiki/(.{1,200})/(.{2})$ ?wiki=$1&lang=$2 [B]
RewriteRule ^wiki/(.{1,200})/([0-9]+)$ ?wiki=$1&p=$2 [B]
RewriteRule ^wiki/(.{1,200})$ ?wiki=$1 [B]

ErrorDocument 402 /?do=404	
ErrorDocument 403 /?do=404
ErrorDocument 404 /?do=404
ErrorDocument 500 /?do=404

Исходя из этого файла ледует, что ЧПУ делается путём регулярного выражения на mod rewrite
Давайте же изменем данный файл, под наш импровизированный форум. Всй проще некуда, заменяем строку
RewriteRule ^cat/(.{1,200})$ razd.php?act=viewcat&name=$1 [B]
на
RewriteRule ^forum/(.{1,200})$ forum.php?name=$1 [B]

тоесть, то что идёт в URL за словом forum/ будет автоматом направляться в наш скрипт в гет запросе в переменную $_GET['name'].
Теперь надо преобразовать сам наш форум,
раньше у нас было получение по уникальному id :
$idi=ceil(intval($_GET['id'])); //Получаем ид в вводимом юрл
$olo=mysql_Query("select * from `forum` where `id`=$idi"); //Получаем данные топика
if (mysql_num_rows($olo)==0) { //если нет темы, обрываем скрипт
echo 'Net temi';
exit();
}
else {
$poo=mysql_fetch_assoc($olo);
// отображаем тему 
}

теперь надо переделать наш форум под ЧПУ
$name=mysql_real_escape_string(rawurldecode(trim($_GET['name']))); // получаем название топика, и раскодируем его из юрл формата? А также защищаемся от иньекций
$olo=mysql_query("select * from forum where `name1`='$name'"); // получаем тему по полю  name1 (потом обьясню)
if (mysql_num_rows($olo)==0){
exit('net temi'); }
else {
$poo=mysql_fetch_assoc($olo);
}

(чтобы отобразить ссылку на тему, нужно писать так echo '<a href="/forum/'.rawurlencode($poo['name1']).'">'.$poo['name'].'</a>'; Нужно обязательно закодировать название данной функцией, функция кодирует все символы в юрл-формат, если же вы это не сделаете, у вас на страницах будут синкт. ошибки (надо кодировать только адрес)

И последний аспект - если в названии темы будут пробелы, ОНИ БУДУТ ЗАМЕЩАТЬСЯ ФУНКЦИЕЙ RAWURLENCODE на символы %20 . это не очень красиво,и поэтому надо перед созданием топика,
вписать следущий код $name1=str_replace(' ','_',$name); и добавить дополнительный столбец в таблицу forum, такой же как и `name` это заменит все некрасивые символы на подчёркивание.
.
Тоесть мы используем столбец `name` исключительно для вывода имени топика,
а rawurlencode($poo['name1']), для отображения ссылки на топик,
в следущий раз я научу вас делать постраничную навигацию под джон на ЧПУ,
дайте мне куратора исправит ошибки
.
Что некому не пригодилось? Альк, а как в пятёрке данный механизм реализован?
.
bleakas (27.07.2012/12:59)
Что некому не пригодилось? Альк, а как в пятёрке данный механизм реализован?
В пятёрке php-роутинг
.
Немного не понятна эта мания на ЧПУ, хотя сам тоже использую роутер, с ним гораздо удобнее

exit('net temi'); }
$idi

А вот затакое надо бить по рукам гг
Что это еще за транслит в коде? Уж лучше по русски тогда пиши, хотя по моему лучше когда в коде вообще нет символов своего языка, для них есть i18n
.
Поисковики повышают страницы в топах за чпу, и намногих движках он есть. Кто нибудь, скажите что такое роутер , и чем его идят.
.
Я думал ты тут свой вариант предложишь, а ты просто скопировал код из другого двига
.
bleakas, Если вкратце, то все запросы к серверу, которые не ведут на реально существующие файлы и(или) папки, перенаправляются на index.php средствами .htaccess, а потом, уже средствами PHP, строка url разбирается на сегменты и подключаются нужные модули.

Кпримеру: url: /photo/1/edit запустит метод edit контроллера Photo и передаст ему 1 в качестве аргумента.
.
L!MP (27.07.2012/14:17)
bleakas, Если вкратце, то все запросы к серверу, которые не ведут на реально существующие файлы и(или) папки, перенаправляются на index.php средствами .htaccess, а потом, уже средствами PHP, строка u
Иными словами получится такой адрес
photo.php?edit=1
.
~XeOn~, нет, адрес никак не изменяется. Он такой же, как ты видишь его в браузере.
Всего: 50