Красивые URL
Если вы работаете с PHP под Apache, добиться красивых адресов в адресной строке совсем просто. Согласитесь, проще запомнить адрес
Работа происходит в 2 этапа.
1. Создаётся файл
2. А это нам и нужно. Мы имеем файл
Теперь уже дело техники включить нужный файл. Например, если все файлы хранятся у вас в папке
Но это уже тема для другой записи.
______
* это можно сделать, например, так:
www.site.ru/company/director, чем
www.site.ru/modules.php?module=2&set=24&page=director.
Работа происходит в 2 этапа.
1. Создаётся файл
.htaccess, в котором находится следующий текст:
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_URI} !^/images.*
RewriteCond %{REQUEST_URI} !^/css.*
RewriteRule ^(.*)$ index.php?data=$1 [QSA]
Первой строчкой инициализируется модуль mod_rewrite, который позволяет на лету «переписывать» адреса. Вторая определяет директорию (в данном случае корневую), относительно которой читаются все правила. RewriteCond отвечает за условия (в примере — отсутствие в начале адресов файлов фрагментов images и css, чтобы адреса картинок и стилевых файлов не трансформировались, а выдавались как есть). RewriteRule — собственно правило, основанное на языке регулярных выражений. В примере всё (.*), что располагается после имени сервера, подвергается замене. Символы ^ и $ означают соответственно начало и конец строки, за которую принят путь к конечному файлу (в примере это company/director). Строка, взятая в скобки (точка — любой символ, звёздочка — любое количество этих символов), сравнивается с образцом (строка адреса). Всё, что находится после имени домена, записывается в переменную $1 в финальном адресе. В итоге то, что мы видим как www.site.ru/company/director, сервер воспринимает как www.site.ru/index.php?data=company/director.
2. А это нам и нужно. Мы имеем файл
index.php, в котором первым делом происходит разбор строки запроса (то, что записано после вопросительного знака, т.е. data=company/director). В языке PHP с помощью переменной-массива $_GET можно получить доступ ко всем переменным, переданным через адресную строку. Нетрудно догадаться, что переменная $_GET['data'] («данные») равна строке company/director.
Теперь уже дело техники включить нужный файл. Например, если все файлы хранятся у вас в папке
pages, то делаем включение с проверкой на существование файла:
if(file_exists('pages/'.$_GET['data'].'.php')) {
require 'pages/'.$_GET['data'].'.php';
}
else {
echo 'Беда! Беда! Страница не найдена!';
}
Конечно, в таком сыром виде делать этого нельзя. Перед влючением живого и трепещущего файла стоит обработать данные, которые передаются в адресной строке: убрать потенциальные http://, опасные символы, обрезать ненужные слэши по бокам* и т.п. Да и включать файл сразу не всегда целесообразно: иногда хочется сначала обработать его как строку.
Но это уже тема для другой записи.
______
* это можно сделать, например, так:
function trimSlashes($str) {
$str = str_replace('/',' ',$str);
$str = trim($str);
$str = str_replace(' ','/',$str);
return $str;
}
Комментарии
Спасибо. Полезная статья. Скажите, есть ли метод позволяющий добавлять к адресной строке некую переменную со значением. Пример: у меня есть большой сайт, где нужно добавить ко всем ссылкам lang=$lang в зависимости от значений сессий. Может знаете как это сделать проще всего?
Dobrij vecher! Spasibo za horoshuju stat'ju!
Interesno kak k dannomu metodu otnosjatsja poiskovije servera (kak indeksirujutsja podobnije URL'i)? Spasibo.
Поисковики корректно их воспринимают, проверял специально, да и вообще алгоритмы современных поисковиков достаточно гибкие. Главное, чтобы странице соответствовал URL, а как он построен (как GET-запрос или как страница), уже второй вопрос.
Одно но - рецепт только под апач.
Правильное уточнение, добавил это в посте. Мне сейчас, если честно, сложно придумать, ради чего я мог бы отказаться от Apache в качестве сервера.