2.1 Настройка работы Apache
Сперва так настроим Apache, чтобы нам было удобно работать с нашим сервером. При старте Apache по умолчанию читает файл насроек httpd.conf, который обычно находится по адресу C:\Program Files\Apache Group\Apache\conf\httpd.conf (если Вы, конечно, установили его туда как я описывал в первой части). Это обычный текстовый файл, открывайте его блокнотом, FAR Manager или любым любимым текстовым редактором.
2.1.1 DocumentRoot, или где наши файлы хранятся.
Директива DocumentRoot задаёт, откуда будет вебсервер брать файлы, когда мы будем делать к нему запросы. По умолчанию настройка такая:
DocumentRoot "C:/Program Files/Apache Group/Apache/htdocs"
Далеко не всегда удобно лазить в такую директорию. Мы создаём директорию C:/www, в ней поддиректорию C:/www/htdocs и меняем значение директивы на
DocumentRoot "C:/www/htdocs"
После запуска сервера, файл c:/www/htdocs/index.html будет доступен по адресу http://(имя сервера)/index.html
Обратите внимание, что в пути вместо стандартного для Win - систем обратного слэша "\" используется прямой - "/". Это объясняется тем, что Apache разрабатывался изначально для *nix - систем. Если мы хотим использовать обратные слеши, нужно их удваивать, например,
"C:\\www\\htdocs"
2.1.2 ScriptAlias, или где хранятся CGI-скрипты
По умолчанию, имеется директива
ScriptAlias /cgi-bin/ "C:/Program Files/Apache Group/Apache/cgi-bin/"
Точно так же, меняем её на
ScriptAlias /cgi-bin/ "C:/www/cgi-bin/"
К скриптам, расположенным в директории c:/www/cgi-bin/..., можно будет обращаться по адресу http://(имя сервера)/cgi-bin/...
2.1.2 Вспоминаем про права доступа через web
Права доступа к папке задаются в секции
<Directory "C:/Program Files/Apache Group/Apache/htdocs">
Мы переместили папку, и меняем теперь расположение
<Directory "C:/www">
Options Indexes Includes
AllowOverride All
Allow from all
</Directory>
Тут мы задаем ряд настроек по умолчанию для нашего каталога c:\www и всех подкаталогов, которые в нем содержатся: автоматическую генерацию списка содержимого каталога при просмотре его в браузере, поддержку SSI, возможность использовать файлы .htaccess для индивидуальной настройки каталогов (хотя их использование замедляет работу сервера, и поэтому не рекомендуется!)
2.1.3 Как будут звать наши cgi-скрипты?
Строка
#AddHandler cgi-script .cgi
заменяется на
AddHandler cgi-script .cgi
Тут мы указываем серверу, что файлы с расширением .cgi надо рассматривать как cgi - модули, и выдавать результат их исполнения, а не исходный код.
2.1.4 SSI нужно включить
Ищем строчки
#AddType text/html .shtml
#AddHandler server-parsed .shtml
И меняем их на
AddType text/html .shtml
AddHandler server-parsed .shtml .html .htm
Здесь мы указываем серверу, файлы с какими расширенями будут обрабатываться как SSI.
Примечание
SSI (Server Side Include) - технология, которая позволяет включать в WEB - страницу "внешние" файлы (будь то другая html - страница или скрипт, находящийся в папке cgi-bin). Таким образом можно строить сайт как бы по кирпичикам.
2.1.5 Не забудьте сохранить изменения в файле httpd.conf
Общая настройка Apache закончена. Нажмите Пуск -> Выполнить, введите команду
net start apache.
Теперь если в адресной строке браузера Вы введете http://localhost, то высветится страничка index.html, расположенная в папке c:\www\html, а если ее там нет, то список файлов в этой папке.
2.2 Настройка связки Apache + PHP5
2.2.1 Скопируйте файл php5ts.dll из папки C:\php в папку C:\WINDOWS\SYSTEM32
2.2.2 Скопируйте файл php.ini-dist из папки C:\php в каталог C:\WINDOWS и переименуйте его в php.ini, откройте в блокноте, найдите переменные, указанные ниже и установите их значения, как написано ниже:
register_globals = off
magic_quotes_gpc = off
magic_quotes_runtime = off
error_reporting = E_ALL # - и именно так, никаких E_ALL & ~E_NOTICE и пр.!
display_errors = on
Примечание:
Если Вы начинающий программист на PHP, то советую Вам установить значение register_globals = on. Объясню почему: почти во всех руководствах по РНР пишут, что даные, полученные из формы, или переданные по ссылке, вот так: http://localhost/my_script.php?variable1=x&variable2=y автоматически становятся переменными PHP, $x и $y. Но эта информация немного устарела.
Приведу по этому поводу отрывок с сайта http://phpfaq.ru
"Дело в том, что в целях безопасности, начиная с версии 4.1, РНР настраивается по умолчанию так, чтобы переданные значения не назначались переменным.
Получить же переданное значение можно обратившись к соответствующему массиву.
Например:
Если передаем методом GET, обратившись к скрипту по ссылке вида
script.php?var=value
или отправив форму, указав в ней method="GET",
то все переменные содержатся в массиве $_GET.
echo $_GET['var']; напечатает "value".
Если получаем данные из формы, отправленной методом POST, то все поля этой формы содержатся в массиве $_POST. Допустим, в форме был элемент
<input type="hidden" name="var" value="1">,
то в скрипте, который указан в action формы, можно написать echo $_POST['var']; и будет выведена 1.
Поэтому, если вы уверены, что переменная есть, но вы не можете ее найти - ищите ее в суперглобальных массивах.
Подробнее о них можно почитать на русском языке в официальной документации http://ru2.php.net/variables.predefined
То же касается и серверных переменных, таких, как $REMOTE_ADDR, $PHP_SELF. Получить их можно, обратившись к массивам $_SERVER, $_ENV или функцией getenv - getenv('HTTP_REFERER');
Переменные, зарегистрированные в сессии, следует искать в массиве $_SESSION.
Данные cookie содержатся в массиве $_COOKIE, сведения о закачанных файлах - в $_FILES
Переменные окружения - в $_ENV, а так же, существует массив $_REQUEST, в котором собраны данные из GET, POST и cookie.
Важно! Весьма в поисках переменных помогает одна их главных функций PHP - phpinfo()
ее следует применять всякий раз, когда вы "потеряли" переменную, вызовите phpinfo(32); в скрипте, в котором не работает авторизация, в скрипте, который принимает файл при аплоаде - и все найдется!
За назначение переменных отвечает параметр register_globals в php.ini.
Если register_globals=on, то все полученные скриптом данные будут назначены соответствующим переменным.
Разработчики PHP настоятельно рекомендуют выключать register_globals (такой режим даже введен по умолчанию во всех новых версиях) и пользоваться данными, полученными от пользователя, только обращаясь к соответствуюим массивам.
Это сделано потому, что при register_globals = on легко взломать небрежно написаный скрипт.
К примеру, функция авторизации выставляет переменную $admin=1, а если авторизации не было, то не делает ничего. В таком скрипте при register_globals=on очень легко стать админом, просто обратившись к нему script.php?admin=1
Огоромное количество сайтов было взломано таким образом.
К тому же, register_globals = off заставляет пользоваться суперглобальнми массивами ($_GET, $_POST и т.д.), что помогает избежать путаницы. ОЧЕНЬ много людей, записав некую переменную в сессию, а потом пытаясь изменить ее значение, передавая ее скрипту методом GET, долго не могли понять, почему у них ничего не работает? Поэтому
очень важно при работе с сессиями, при любых настройках (и особенно - при register_globals=on!) работать только с массивом $_SESSION, как это описано в соответствующем разделе.
То есть, register_globals=off - на самом деле не цель, а средство. Побудительный мотив для программиста писать защищенные скрипты и избегать путаницы.
Если вы хотите написать скрипт, не зависящий от настройки register_globals, и при этом защищенный - переменные надо объявлять перед использованием. На это нацелена еще одна инициатива разработчиков PHP - написание программ при уровне отображения ошибок (error_reporting) равном E_ALL, при котором об использовании необъявленных переменных выдаются предупреждения.
Именно объявление ВСЕХ переменных, используемых в скрипте и являетс гарантией от взлома. Если вы пишете программу для распространения, то гарантией ее безопасности является только объявление переменных.
Если же нет возможности переделать готовый скрипт, но его надо заставить работать при register_globals=off, то надо помнить, что во-первых, вы делаете потенциальную дыру у себя на сайте, а во-вторых, для этого можно воспользоваться функциями extract и import_request_variables
НО: Бездумное использование этих функций является таким же опасным!
Если вы хотите адаптировать старый скрипт под новые правила, то выполните приведенный код именно в таком порядке!
import_request_variables("GPC");
extract($_SERVER);
сначала назначаются переменные, пришедшие от юзера, а потом - предопределенные серверные, чтобы первые не могли затереть одноименные серверные.
ВАЖНО!!! Этот код должен вызываться как можно раньше в скрипте. ДО любого кода и присвоения переменных.
Поскольку он являет собой дыру похлеще register_globals=on!
Ведь если он будет вызываться после присвоения переменных в скрипте, то хакер с легкостью перезапишет их.
Последние версии PHP сообщают вам об этом нотайсом при использовании import_request_variables.
И то правда - три года прошло с тех пор, как введены новые правила. Пора бы уже и научиться писать скрипты правильно.
Но лучше всего пользоваться не свалеными в кучу переменными, а соответствующими массивами. Особенно, если в одном скрипте встречаются переменные из кук, из формы, из сессии - очень много путаницы от этого происходит.
Все то же самое можно прочесть и в документации: http://www.php.net/manual/ru/security.globals.php"
2.2.3 Настроим PHP двумя способами: как модуль Апача и как CGI - бинарник
2.2.3.1 Настройка PHP, как модуля Apache:
В файл конфигурации Apache httpd.conf добавляем:
LoadModule php5_module C:/php/php5apache.dll
(хотя может быть и LoadModule php5_module C:/php/sapi/php5apache.dll. Зависит от Вашей версии PHP. У меня 5.0.3 и этот файл лежит, как в первом случае )
После последней директивы AddModule добавляем строку
AddModule mod_php5.c
Внутри блока <IfModule mod_mime.c> добавляем строку
AddType application/x-httpd-php .php
В строке DirectoryIndex надо прописать еще index.php:
DirectoryIndex index.php index.html
2.2.3.2 Настройка PHP, как CGI - бинарника:
В файл конфигурации Apache httpd.conf добавляем:
Внутри блока <IfModule mod_mime.c> добавляем строку:
AddType application/x-httpd-php .php
Сразу после нее добавляем 2 строки:
ScriptAlias /_php_/ "c:/php/"
Action application/x-httpd-php "/_php_/php-cgi.exe"
Примечание:
Если у Вас стоит четвертая версия PHP, то вместо последней строки надо написать:
Action application/x-httpd-php "/php/php.exe"
В строке DirectoryIndex надо прописать еще index.php:
DirectoryIndex index.php index.html
Примечание:
Я советую Вам устанавливать PHP как модуль Apache. В противном случае, Вы лишитесь некоторых функций в PHP, например очень полезной полезной функции virtual(). Да и вообще, на мой взгляд, PHP, установленный как модуль Apache работает стабильнее и быстрее.
2.2.4 Вот и все! Мы уже настроили Apache и PHP. Теперь проверим работу. Создайте файл index.php в папке C:\www\html, а в нем напишите следующие строчки:
<?
phpinfo();
?>
Теперь если Вы, написав в адресной строке браузера http://localhost/index.php, увидите страничку с информацией о версии PHP, установленной на Ваш компьютере, то значит, что все работает, связка Apache+PHP настроена правильно.