Сумрачный блог Кирилла Панфилова

Красивые URL

Если вы работаете с PHP под Apache, добиться красивых адресов в адресной строке совсем просто. Согласитесь, проще запомнить адрес 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;
	}
Яндекс.Метрика