Инструкция DocumentRoot определяет каталог, в котором хранятся документы веб-сервера. Из соображений безопасности файлы настройки хранятся в другом каталоге. Как мы уже видели, инструкция DocumentRoot в Solaris представлена следующим образом:
DocumentRoot "/var/apache/htdocs"
Чтобы применить инструкции к определенным каталогам, необходимо создать для этих инструкций контейнер (container). Следующие три инструкции httpd.conf применяются для создания контейнеров:
<Directory pathname> - Инструкция Directory создает контейнер для инструкций, относящихся к каталогу pathname. Любая инструкция настройки, следующая за инструкцией Directory и предшествующая следующему оператору </Directorу>, применяется только к указанному каталогу.
<Location document> - Инструкция Location создает контейнер для инструкций, относящихся к конкретному документу (document). Любая инструкция настройки, следующая за инструкцией Location и предшествующая следующему оператору </Location>, применяется только к указанному документу.
<Files filename> - Инструкция Files создает контейнер для инструкций, относящихся к конкретному файлу (filename). Любая инструкция настройки, следующая за инструкцией Files и предшествующая следующему оператору </Files>, применяется только к указанному файлу. Имя файла (filename) может указывать одновременно несколько файлов, если содержит один из специальных символов Unix, * или ?. Кроме того, если за инструкцией Files следует необязательный символ " (тильда), имя файла (filename) интерпретируется как регулярное выражение.
С каталогами и файлами легко разобраться, поскольку это знакомые каждому администратору компоненты файловой системы Unix. Понятие документа характерно уже не для файловой системы, но для веб-сервера. Страница с информацией, отображаемая в ответ на запрос к веб-серверу, является документом: она может состоять из многих файлов, хранящихся в различных каталогах. Контейнер Location позволяет обращаться со сложными документами как с единичными сущностями. Ниже в тексте главы мы рассмотрим примеры использования контейнеров Location и Files. А пока обратимся к контейнерам Directory.
В настройках Solaris определены контейнеры Directory для корневого каталога сервера и каталога DocumentRoot:
<Directory /> Options FollowSymlinks AllowOverride None </Directory> <Directory "/var/apache/htdocs"> Options Indexes FollowSymLinks AllowOverride None Order allow,deny Allow from all </Directory>
Каждый контейнер Directory начинается с инструкции Directory и заканчивается тегом </Directory>. Каждый из контейнеров содержит операторы настройки, которые относятся только к одному из каталогов. Назначение инструкций в данных контейнерах описано далее в разделе «Безопасность веб-сервера». На данном этапе достаточно понять, что контейнеры в файле httpd.conf применяются с целью ограничения области действия различных инструкций настройки.
Инструкции Alias и ScriptAlias выполняют отображение URL-пути в имя каталога на сервере. Так, файл настройки в Solaris содержит следующие три инструкции:
Alias /icons/ "/var/apache/icons/" Alias /manuals/ "/usr/apache/htdocs/manual/" ScriptAlias /cgi-bin/ "/var/apache/cgi-bin/"
Первая строка отображает URL-путь /icons/ в каталог /var/apache/icons/. Таким образом, запрос www.wrotethebook.com/icons/ является запросом www.wrotethebook.com/var/apache/icons/. Вторая инструкция отображает URL-путь /manuals/ в www.wrotethebook.com/usr/apache/htdocs/manual/.
Инструкций Alias, устанавливающих подобные отображения, может быть сколько угодно, но инструкция ScriptAlias может быть только одна. ScriptAlias действует точно так же, как инструкция Alias, с той разницей, что конечный каталог содержит исполняемые CGI-программы. Следовательно, httpd разрешает исполнение файлов из данного каталога. Инструкция ScriptAlias особенно важна потому, что позволяет хранить исполняемые веб-сценарии в каталоге вне иерархии DocumentRoot. Сценарии CGI - без преувеличений наиболее уязвимое место вашего сервера; хранение этих сценариев в отдельном каталоге позволяет более жестко разграничивать доступ к ним.
Настройки для Solaris содержат контейнеры каталогов /var/apache/icons и /var/apache/cgi-bin, но не каталога /usr/apache/htdocs/manual. Упоминание каталога в httpd.conf вовсе не требует создания контейнера Directory для этого каталога. Контейнеры /var/apache/icons и /var/apache/cgi-bin выглядят следующим образом:
directory "/var/apache/icons"> Options Indexes MultiViews AllowOverride None Order allow,deny Allow from all </Directory> <0irectory "/var/apache/cgi-bin"> AllowOverride None Options None Order allow,deny Allow from all </Directory>
Контейнеры содержат операторы AllowOverride, Options, Order и Allow, которые относятся к безопасности. Большинство инструкций в контейнерах файлов, документов и каталогов явно или неявно связаны с вопросами безопасности. Все инструкции из приведенных выше контейнеров рассмотрены далее в этой главе в разделе «Безопасность веб-сервера».
Инструкция UserDir позволяет пользователям создавать домашние страницы и указывает на каталог, в котором они хранятся. UserDir, как правило, указывает на каталог public_html, что и можно наблюдать в настройках Solaris. Такие настройки по умолчанию позволяют пользователю создать подкаталог public_html в своем домашнем каталоге и поместить в него домашнюю веб-страницу. Например, если поступает запрос по адресу www.wrotethebook.com/~sara, происходит преобразование в адрес www.wrotethebook.com/ export/home/sara/public_html. Кроме того, инструкция UserDir позволяет указать полное имя - скажем, /export/home/userpages. Администратор системы создает этот каталог и разрешает пользователям сохранять домашние веб-страницы в подкаталогах этого каталога. В последнем случае запрос адреса www.wrotethebook.com/~sara будет преобразован в запрос адреса www.wrotethebook.com/export/home/userpages/sara. Такой подход имеет свои преимущества и недостатки: облегчает наблюдение за содержимым страниц пользователей, однако требует создания и защиты отдельного дерева веб-каталогов, в то время как веб-каталог в домашнем каталоге пользователя автоматически наследует существующие права доступа.
Инструкции PidFile и ScoreBoardFile указывают пути к файлам, определяющим состояния процессов. Параметр PidFile обозначает файл, в котором httpd хранит свой идентификатор процесса, параметр ScoreBoardFile - файл, в который httpd записывает сведения о состоянии процесса.
Параметр Directorylndex определяет имя файла, возвращаемого сервером, если запрос клиента не содержит имени файла. В нашей системе Solaris данный параметр определен следующим образом:
Directorylndex index.html
Исходя из значений параметров DocumentRoot и Directorylndex сервер, получив запрос документа http://www.wrotethebook.com, вернет клиенту файл /var/apache/htdocs/index.html. Получив запрос документа http://www.wrotethebook.com/books/, сервер вернет клиенту файл /var/apache/htdocs/books/index.html. Значение DocumentRoot предваряет все имена файлов, a Directorylndex добавляется к любому запросу, который не заканчивается именем файла.
Ранее в этой главе мы видели из вывода Is для каталога /var/apache/htdocs, что в каталоге существует файл index.html. Что же произойдет в отсутствие такого файла? Что Apache передаст клиенту? Если файл index.html не существует, httpd посылает клиенту список файлов каталога - если это допускается настройками. Передача содержимого каталога разрешена, если инструкция Options в контейнере Directory данного каталога содержит ключевое слово Indexes. (Более подробно рассмотрим Options позже.) Если разрешено получение клиентом индекса каталога, форматированием списка содержимого можно управлять с помощью ряда дополнительных инструкций.