Сегодня все привыкли к приянтному на глаз формату URL (человеко понятным урлам).
Большинство разработчиков поступают просто:
создают шаблон в htaccess файле для mod_rewrite модуля apache и все работает.
Но что делать, если шаблон URLа может изменятся (например, сайт может отлично работать в режиме: http://site.com/page, но при этом, для поддержки языков, должен работать и в формате: http://site.com/ru/page, при этом показывая те же данные).
Или другой пример: разные страницы сайта обрабатываются разными скриптами, при этом количество фактических параметров, полученных через строку браузера у скриптов разное (http://site.com/?page=index&id=12 и http://site.com/?page=photos&album=2&p_id=12&…)
В таких случаях mod_rewrite бессилен, там как он способен обрабатывать запросы одинаковые по количесвту параметров.
Что же делать в этом случае?
Для этого есть отличное решение:
- В файле htacces в корне сайта устанавливаем редирект всех запросов на один файл php (index.php, например)
- В файле index.php настраиваем обработку строки запроса.
Получается что-то вроде своего собственного mod_rewrite, заточенного под собственные требования.
htaccess
[sourcecode language='cpp']
RewriteEngine On
#Подкулючаем модуль mod_rewrite
RewriteCond %{SCRIPT_FILENAME} !-f
#Отключаем редирект запросов, если запрос идет к существующему файлу
RewriteCond %{SCRIPT_FILENAME} !-d
#Отключаем редирект запросов, если запрос идет к существующей папке
RewriteRule ^(.*)$ index.php/$1
#Переводим все запросы на index.php
[/sourcecode]
php
[sourcecode language="php"]
< ?php
$url= $_SERVER['REQUEST_URI']; //Получаем полную строку запроса к сайту
$urla=explode('/',$url); //Разбиваем строку на параметры
print_r($urla); //Выводим на экран (временно)
?>
[/sourcecode]
Теперь у нас есть массив всех параметров, которые пришли на сайт от посетителя. То есть теперь мы можем вызвать скрипт вывода на экран данных, передав в него массив параметров.
Допустим 1-й параметр — это название раздела сайта (новости/фотогалерея/форум). А параметры после первого (их точное количество нам не известно) используются уже непосредственно модулями, выполняющими вывод новостей или фотографий или форума.
Тогда по 1-му параметру мы определям модуль, который должен начать работу, и передаем ему массив параметров, которые он уже самостоятельно обрабатывает.
Например:
Входящая строка: http://site.com/news/21/12/2008/
Получили в файле index.php:
[sourcecode language="php"]
['news','21','12','2008']
[/sourcecode]
Проверяем какой модуль вызвать:
[sourcecode language="php"]
if ($urla[0]==’news’)
$mod_news->show($urla);
[/sourcecode]
и передаем в него параметры.
Все. Задача выполнена. Сайт может получать любое количество параметров.
Read More