Здравствуйте.
Здесь я расскажу о том, как просто и удобно организовать технологию ЧПУ на своём сайте.
ЧПУ — это Человеку Понятные УРЛ (URL). В англоязычном интернете называется SEF links — Search Engines Friendly links (ссылки, дружественные поисковым системам).
Это делается для того, чтобы ссылки на страницы вашего сайта имели красивый вид, понятный человеку и дружественный для поисковых систем.
Например, ссылка http://localhost/forum/users/Figaroo/ гораздо легче запоминается человеком, чем http://localhost/?mode=forum&page=users¶m=Figaroo. Также, первую ссылку гораздо легче продиктовать по телефону.
Чтобы перейти на уровень вверх достаточно стереть нужную часть пути, если человек уже был на вашем сайте и набирает адрес страницы вручную, то он сразу может обратиться к нужному ему документу глядя на URL'ы предыдущих запросов.
Пользователь может быстро и безошибочно определить свое местонахождение на сайте. Это удобно.
Также, такие адреса легче и быстрее индексируются поисковыми машинами, такими как Яндекс, Гугль и др.
Теперь о том, как это реализовать для сайта на языке PHP. (Пример приведён для сервера Apache с включённым mod_rewrite.)
В файле .htaccess (расположенном в корневой директории сайта) разместим следующий код:
# включаем mod_rewrite
RewriteEngine On
# если запрашиваемый пользователем URL - это не существующий на сервере файл...
RewriteCond %{REQUEST_FILENAME} !-f
# ...и не существующая на сервере директория
RewriteCond %{REQUEST_FILENAME} !-d
# перенаправляем запрос пользователя на index.php
RewriteRule ^(.*)$ index.php [L]
Далее, в корневой директории сайта создадим файл index.php:
<?php
// предшествующий код сайта
$_URL = preg_replace("/^(.*?)index\.php$/is", "$1", $_SERVER['SCRIPT_NAME']);
$_URL = preg_replace("/^".preg_quote($_URL, "/")."/is", "", urldecode($_SERVER['REQUEST_URI']));
$_URL = preg_replace("/(\/?)(\?.*)?$/is", "", $_URL);
$_URL = preg_replace("/[^0-9A-Za-z._\\-\\/]/is", "", $_URL); // вырезаем ненужные символы (не обязательно это делать)
$_URL = explode("/", $_URL);
if (preg_match("/^index\.(?:html|php)$/is", $_URL[count($_URL) - 1])) unset($_URL[count($_URL) - 1]); // удаляем суффикс
switch (@$_URL[0]) {
case '': /* главная страница */ break;
case 'my_page': /* пример страницы. здесь можно сделать что-нибудь вроде "require_once('./pages/my_page.php');" */ break;
default: /* ошибка - страницы нет. можно послать 404-ый заголовок и показать прикольный текст. */
}
// последствующий код сайта
?>
Таким образом все запросы, кроме запросов к реально существующим на сервере файлам и папкам (к примеру, картинкам, таблицам стилей, скриптам и т.п.), перенаправятся на файл index.php.
В файле index.php создастся переменная-массив $_URL.
К примеру, наш сайт располагается по адресу http://localhost/mysite/.
Тогда, если мы перейдём по адресу http://localhost/mysite/users/Figaroo/edit/ или же http://localhost/mysite/users/Figaroo/edit/index.html,
то $_URL будет равным array('users', 'Figaroo', 'edit').
Дальше index.php может анализировать нулевой элемент массива $_URL и решать, как поступать дальше. К примеру, он может подключать необходимый код с помощью инструкций require или include.
Преимущества данного метода в том, что сайт может находиться во вложенных папках, скажем в http://localhost/sites/my/, при этом массив $_URL не будет «загрязняться» элементами "sites" и "my". Это также даёт возможность переместить сайт во вложенный каталог или каталог выше без потери работоспособности. Также, если к адресу страницы приписать суффикс "index.html" или "index.php", адрес будет вести на страницу без суффикса (как в настоящих директориях).
Спасибо за внимание.
Спасибо за статью! Очень пригодилась!
Комментарий by moonmana — 2 сентября 2009 @ 21:39
Спасибо огромное за статью! Она меня оч выручила!
Для мало малоопотных рекомендую испытать данный скрипт добалением в конец index.php
После этого набираем:
, где $mysite$ - путь к вашему сайту, в том случае если он не расположен в
И смотрим результат =).
Комментарий by v01d.cmd — 16 декабря 2009 @ 19:45
Спасибо огромное! Очень долго искал нечто такое! Мой ход - после разбора массива я по уникальному псевдониму ищу запись в базе (при создании записи псевдоним тоже вводится вручную) и делаю выборку. Примерно так получается
Вобщем все работает просто идеально!
Комментарий by Евгений — 22 января 2010 @ 17:00
Статью бы дополнить, что для этого необходим у Апача Mod_rewrite, для чего следует в файле httpd.conf (файл настроек Апача)
раскомментить эту строчку (убрать #)
LoadModule rewrite_module modules/mod_rewrite.so
И неплохо было бы расписать, что конкретно делают эти строчки
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]
Комментарий by Alurum — 12 августа 2010 @ 23:48
2Alurum: спасибо за отзыв, дополнил.
Комментарий by Figaroo — 17 августа 2010 @ 22:46
Что-то толком не пойму смысл второй и третьей строчек:
$_URL = preg_replace("/^".preg_quote($_URL, "/")."/is", "", urldecode($_SERVER['REQUEST_URI']));
$_URL = preg_replace("/(/?)(?.*)?$/is", "", $_URL);
можете подробнее объяснить что тут происходит?
Комментарий by Roms — 9 сентября 2010 @ 20:43
Это необходимо в случае, если сайт находится в подпапке, скажем, .
Комментарий by Figaroo — 10 сентября 2010 @ 20:48