четверг, 30 июля 2015 г.

Как перенаправить все запросы в Apache2 одному скрипту

В web-программировании существует проблема, что при запросе разных страниц (речь идёт о php) вызываются разные скрипты, то есть программа на php имеет множество точек входа, что не есть правильно, т.к. в рамках одного приложения должны производиться какие-то одинаковые действия при запуске и остановке (открытие файлов, инициализация объектов, подключение к базе данных и т.д.), поэтому в каждом файле необходимо включать единый скрипт инициализации, что не совсем удобно.
При другом подходе, когда существует один скрипт, но запрос страниц происходит через get-параметры, требуется чётко следить за путями к содержанию страниц, т.е. если мы хотим включить в страницу некоторый файл html, который расположен не в корневом каталоге, и который имеет картинки и другой контент, то нужно позаботится о том, чтобы ссылки на странице были относительно файла скрипта корректными. Такой подход также используется в сайтах, написанных, например, на Perl или Python.
Чтобы избежать такой ситуации, но так, чтобы пользователь видел адрес запрашиваемой страницы в нормальном виде, можно включить обработчик, то есть при запросе страницы будет передано управление одному скрипту, который получит в параметрах адрес запрашиваемой страницы. Таким образом, например, можно написать контент для сайта в виде простых html-файлов, а оформление страницы будет задаваться единым шаблоном с помощью одного скрипта.
Существует по крайней мере 2 способа передачи управления одному скрипту. Заранее скажу, что после включения/выключения модов следует перезапускать Apache.

Мод Actions

Для того, чтобы задействовать эту возможность, нужно включить мод:
# a2enmod actions
Далее в настройках виртуального хоста или в файле .htaccess в корневой папке сайта нужно добавить следующее:
# Документы этого типа мы желаем "пропускать" через обработчик
AddHandler handler .html .htm .php
# Замкнем имя обработчика на конкретный файл
Action handler /index.php?
Здесь handler – просто удобное название обработчика.
/index.php? указывает на то, что всё будет перенаправлено скрипту /index.php через GET-параметры. Если не указать знак вопроса, то параметры будут переданы через POST.
Скрипту будет передан один параметр – строка запроса, т.е., например, если мы введём http://example.com/somedir/file.html?action=foo, то скрипт получит параметр /somedir/file.html?action=foo.
Здесь есть минус – параметры, переданные пользователем, нужно обрабатывать самостоятельно, то есть в php они будут недоступны в массиве $_GET. Кроме того, файлы .php почему-то не хотят перенаправляться, хотя им можно дать расширение html, и тогда пользователю будет казаться, что сайт – статический.

Мод Rewrite

Можно активизировать мод rewrite, который просто подменяет введённый адрес на заданный. Для включения мода нужно ввести:
# a2enmod rewrite
После чего в .htaccess или в конфиг сайта добавить:
#Включить подмену адреса
RewriteEngine on
#Подменять, только, если это не index.php
RewriteCond %{REQUEST_URI}  '!=/index.php'
#Поменять все php, html и htm страницы
RewriteRule ^.*\.(php|html|htm)\??.*$ /index.php
  • RewriteEngine on – обязательно вводится, чтобы подмена работала.
  • RewriteCond – необязательный параметр, используется условие подмены, в данном
случае проверяется, чтобы сам скрипт не был перенаправлен сам себе (хотя может ничего страшного и не будет, я не пробовал отключать).
  • RewriteRule – самый главный параметр, указывает, как подменять запрос, здесь
используются регулярные выражения, первое – что подменять, второе – чем.
По сравнению с обработчиком, параметры GET передаются в php в массив $_GET, в Perl доступны через модуль CGI и т.д. Строка запроса доступна через $SERVER["REQUEST_URI"], из которой можно вытянуть запрашиваемый файл и обработать его должным образом.
Лично я пользуюсь именно таким способом.

Комментариев нет:

Отправить комментарий