четверг, 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"], из которой можно вытянуть запрашиваемый файл и обработать его должным образом.
Лично я пользуюсь именно таким способом.

суббота, 25 июля 2015 г.

Настройка виртуальных хостов в Apache2 (в linux)

Основные настройки сервера можно найти в /etc/apache2 (debian):
  • apache2.conf – общие настройки, их можно и не трогать;
  • sites-available/*.conf – доступные настройки для сайтов;
  • sites-enabled/*.conf – настройки активных сайтов;

Виртуальные хосты

Чтобы добавить сайт, нужно настроить виртуальный хост для него (нужен домен). То есть по запросу сайта по адресу example.com будут задействованы одни настройки, а если на этом же сервере, но запрос сайта будет по адресу test.com, то будут задействованы другие настройки. Таким образом, разегистрировав несколько доменов или используя несколько поддоменов, можно разместить на одном сервере несколько сайтов, независимых друг от друга.
Для включения нужно создать файл в sites-available/ с расширением (обязательно) .conf, можно скопировать файл по умолчанию, находящийся в той же папке, чтобы не писать с нуля.
Примерное содержание файла:
<VirtualHost *:80>
 ServerName example.ru
 ServerAlias www.example.ru

 ServerAdmin admin@example.ru
 DocumentRoot /var/www/example.ru/
 
 <Directory /var/www/example.ru>
  AllowOverride All
  Order allow,deny
  allow from all
 </Directory>

 ErrorLog ${APACHE_LOG_DIR}/error.log
 CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

  • *:80 указывает, что с любых адресов будут обрабатываться запросы на порт 80.
  • ServerName – адрес виртуального хоста, т.е. все запросы на сервер по доменному  имени example.ru будут обрабатываться именно с этими настройками.
  • ServerAlias – просто дополнительное имя.
  • ServerAdmin – почта администратора сервера (не знаю зачем, и как действует).
  • DocumentRoot – расположение данных сайта.
  • Directory… – настройки каталога, каталог может быть любым, в том числе и вложенным в основной, и даже корень /.
    • AllowOverride All – позволить перезаписывать настройки для каталога из файлов .htaccess. Остальные настройки не знаю, оставил, как было по умолчанию.
  • ErrorLog и CustomLog – логи сервера, также есть настройки для уровня ведения логов.

Включение виртуального хоста

Чтобы включить хост, нужно запустить команду a2ensite <фал настроек (без пути)> от суперпользователя, apache сделает необходимые действия и сайт будет доступен.
Теперьм можно наполнять папку /var/www/example.ru/
После изменения конфигов нужно запускать # service apache2 reload, а после включения/выключения сайтов # service apache2 restart.