Построение Web-сайта
После того, как Web-сервер сконфигурирован и отлажен, создадим для примера небольшой Web-сайт, чтобы показать, как развертывать информацию в Web.
Построим сайт, который будет содержать информацию о небольшой издательской компании On The Web Publishers. Разместим на сайте список новых изданий, общую информацию об издателе, форму для контактов и защищенный паролем раздел для эксклюзивного использования авторами, имеющим контракт с издателем.
В рамках поставленной задачи попытаемся создать сайт, содержащий HTML-документы и изображения, использующий CGI-программирование и выполняющий контроль доступа защищенного паролем раздела на сайте.
Определим структуру сайта, как показано на рис. 32.2.
Рис. 32.2. Структура Web-сайта
Создадим файлы, необходимые для реализации этой структуры. Подразумевая использование конфигурации, рассмотренной ранее в главе, поместим корневой каталог для дерева HTML-документов в /var /www/html, а каталог CGI - в /var /www/cgi-bin. Дерево каталогов и файлов:
/var/www/html/index.html
/var/www/html/about/index.html
/var/www/html/books/index.html
/var/www/html/contact/index.html
/var/www/html/authors/index.html
/var/www/cgi-bin/formmail
Кроме последнего файла, который мы рассмотрим вкратце, все перечисленные файлы являются HTML-файлами. Все вспомогательные файлы с изображениями, используемые HTML-файлами, можно разместить в тех же каталогах, что и файлы HTML. Многие Web-мастера предпочитают размешать все файлы с изображениями в другом каталоге. Этот каталог может быть следующим.
/var/www/html/images/
Так как в главе не рассматривался язык HTML, оценим два HTML-файла в качестве примеров соответствующих документов. Начнем с главной домашней странички /var/www/html/ index. html. В данном случае исходный текст файла может быть следующим.
<A HREF="/">
<IMG SRC="/images/logo.gif" BORDER=0></A>
<FONT SIZE=5>W</F>elcome to <STRONG>On the Web Publishers</STRONG>.
</BODY> </HTML>
Результат работы этого файла показан на рис. 32.3.
Рис. 32.3. Домашняя страница
Остальные страницы будут выглядеть примерно так же, кроме формы для контактов /var/ www/html/contact/index.html. Форма для контактов показана на рис. 32.4, она реализуется следующим исходным кодом.
<A HREF="/">
<IMG SRC="/images/ldgo.gif" BORDER=0></A>
US</A></TD>
BOOKS</A></TD>
<INPUT TYPE=TEXT WIDTH=30 NAME=city> City<BR>
<INPUT TYPE=TEXT WIDTH=30 NAME=state> State<BR>
<INPUT TYPE=TEXT WIDTH=30 NAME=zip> Zip/Post Code<BR>
<INPUT TYPE=TEXT WIDTH=30 NAME=country> Country<BR>
<INPUT TYPE=TEXT WIDTH=30 NAME=email> E-mail<BR>
Comments:<BR>
<TEXTAREA ROWS=10 COLS=30 NAME=commentS WRAP=HARD></TEXTAREA><BR>
</BODY> </HTML>
Рис. 32.4. Форма для контрактов
Эта страница содержит форму и ссылку на CGI-программу, которая обрабатывает данные из формы. В нашем случае используется программа f ormmail (бесплатно распространяемый сценарий CGI, написанный на Perl), которая считывает содержимое формы и отправляет его по почте на предопределенный почтовый адрес. В рассматриваемом примере контактная информация из формы отправляется по почте на главный почтовый адрес книжного магазина.
Forramail написал Matthew M. Wright. Эта программа доступна по адресу http: / /www. worldwideniart.com/scripts/formmail .shtml. Несмотря на то, что в главе не затрагивалось программирование на Perl и CGI, мы приводим исходный код программы. Можно заметить, что создание несложных CGI-программ не требует особых усилий.
# FonriMail Version 1.6 #
# Matt's Script Archive, Inc.: http://www.worldwidemart.com/scripts/
# COPYRIGHT NOTICE #
# пользователем, при условии сохранности авторских прав и
# случаях знаки авторского права и заголовок должны быть сохранены
# Конец
if ($check_referer != 1) { &error <bad_referer') }
# Определить массивы для дней недели и месяцев года.
# Получить текущее время и формат часов, минут и секунд. Добавить
($sec,$min,$hour,$mday,$mon,$year, $wday) = (localtime(time))[0,1,2,3,4,5,6];
# Определить ассоциативный массив для конфигурации
'redirect 1 ,' 1 , 'bgсоlоr', ",
'print_blank_f ields 1 , ' ', 'missing_f ields_redirect', ") ;
# Декодировать кодировку формы для переменных имени и значения
# будет возвращен. Еще одна брешь в защите перекрыта.
# были использованы пробелы между именами полей или переменными среды.
$Config{'required'} =- s/ (\s+|\n)?,(\s+|\n)?/,/g;
$Config{'required'} =- s/ (\s+) ?\n+ (\s+) ?//g;
$Config{'env_report'} =- s/ (\s+ | \n) ?, (\s+ | \n) ?/ , /g;
$C6n£ig{'env_repO3rt'} =- s/ (\s+) ?\n+ ( \s-i-) ? //g;
$Config{'print_config'} =- s/ (\s+| \n) ?, (\s+| \n) ?/, /g;
# Разложить переменные конфигурации по отдельным именам полей.
@Env_Report = split ( / , / , $Conf ig{'env_report'} ) ;
# Локализация переменных, используемых в этой подпрограмме.
# Для каждого обязательного поля, определенного в форме:
# указано его значение или заполнено пробелами, выдать ошибку.
# отметить его как ошибочное поле .
# с адресом переадресации.
# Напечатать заголовок HTTP и открывающие дескрипторы HTTP.,
print "Ниже находится предоставленная вами информация для ";
print "$Conf ig{'recipient'} . Текущая дата: ";
# Если указано, отсортировать по алфавиту:
# полей, то распечатать поле формы и его значение.
# Присвоить временной переменной $sort_order порядок сортировки,
# и разложить поля сортировки в массив.
$sort_order = $Conf ig{'sort'} ;
$sort_order =~ s/(\s+|\n)?, (\s+| \n) ?/, /g;
$sort_order =~ s/ (\s+) ?\n+(\s+)?//g;
# Проверить наличие ссылки возврата и распечатать ее, если нашли.
->formmail.shtml">FormMail</a> V1. 6 ©
1995 -1997 Matt Wright <br> A Free Product of
<a href="http: //www.worldwidemart .com/scripts/">Matt ' s
# Локализация переменных, используемых в этой подпрограмме.
if ($Conf ig{ ' subject '}) { print MAIL "Subject:
print MAIL "Ниже находится предоставленная вами информация .
От кого : \n" ; print MAIL "$Conf ig{'realname'} ($Conf ig{'email'} ) , дата:
# Если указано, отсортировать по алфавиту:
# полей, распечатать поле формы и его значение,
# и разложить поля сортировки в массив.
$Config{'sort'} =~ s/(\s+|\n)?, (\s+ | \n) ?/ , /g;
$Config{'sort'} =~ s/ (\s+) ?\n+ (\s+) ?//g;
$Config{'sort'} =- s/order://;
# Для каждого поля формы, если оно имеет значение или
# Если указаны переменные среды, послать их адресату,
# параметром вызова подпрограммы.
# Если e-mail адрес содержит:
# соответствует следующему шаблону регулярного выражения, то
# знаком @, за которым следует необязательный символ '[',
# стоять символ ' ] ', так как допустимо иметь email-адрес,
if ($ENV{'HTTP_REFERER'} =~ m| ~https? :
<table border=0 width=600 bgcolor=#9C9C9C>
<table border=0 width=600 bgcolor=#CFCFCF> <tr><td>
<a href="http: //www.worldwidemart.com/scripts/formmail.shtiru">FormMail</a>
по адресу
<tt>$ENV{'HTTP_REFERER'}</tt>
Если Вы пытаетесь сконфигурировать FormMail для запуска этой формы,
->вам нужно добавить следующую информацию к \@referers, более
Добавьте <tt>'$host'</tt> в ваш массив <tt><b>\@referers</b></tt>.
<a href="http: //www.worldwidemart.com/scripts/fonnmail.shtnil">
->FormMail</a> VI.6 © 1995 - 1997 Matt Wright<br>
A Free Product of <a href=" http://www.worldwidemart.com/scripts/ ">
<table border=0 width=600 bgcolor=#9C9C9C> <tr>
A Free Product of
<& href="http: //www.worldwidemart.com/scripts/">
<table border=0 width=600 bgcolor=#9C9C9C> <tr>
<tr><td>Meтод запроса предоставленной Вами формы не совпадает ни с
<tt>GET</tt>, ни с <tt>POST</tt>. Пожалуйста, проверьте форму и
<tt>method=</tt> записан в верхнем регистре и является <tt>GET</tt>
<а href="http: / /www. worIdwidemart. com/scripts/ formmai1. shtml">
->ForMail</a> vi.6 © 1995 - 1997 Matt Wright<br>
A Free Product of <a href=" http://www.worldwidemart.com/scripts/ ">Matt's
->Script Archive, Inc.</a> </font></center> </td></tr>
print «"(END ERROR HTML)";
<tr><td>B переданных для FormMail данных не указан получатель. Пожалуйста, убедитесь, что Вы записали в поле формы 'recipient' e-mail адрес. Более подробную информацию по заполнению поля формы recipient можно найти в файле README.<hr size=l>
<a href=" http://www.worldwidemart.com/scripts/formmail.shtml ">
->FormMail</a> VI.6 © 1995 - 1997 Matt Wright
<br> A Free Product of <a href=" http://www . worldwidemart. com/scripts/">Matt's
<table border=0 width=600 bgcolor=fCFCFCF> <tr>
$missing_field_list </ulxbr>
Эти поля должны быть заполнены для успешной подачи формы. <р> Пожалуйста, используйте кнопку Back браузера для возврата к форме ->и исправьте данные. <hr size=l> <center><font size=-l>
<a href ="http : //www. worldwidemart . com/scripts/formmail.shtml">
->FormMail</a> VI. 6 © 1995 - 1997 Matt Wright<br> A Free Product of
<a href="http: //www. worldwidemart. com/scripts/">Matt's
->Script Archive, Inc.</a> < / font>< / center> </td></tr>
Эта профамма возвращает пользователю HTML-страницу, сообщающую о том, что контактна)? информация в форме обработана или содержит ошибки, если таковые имеются. Это очень важный компонент всех CGI-программ - они должны либо вернуть правильные данные браузеру (например. HTML-документ или содержимое файла с изображением), либо перенаправить браузер на правильный URL.
Профамма f ormmail реализует много других функций: она может установить строку темь; (subject) при отправке e-mail и выполнить проверку того, что сценарий не используется незаконно пользователями с других Web-сайтов. Более детальная информация доступна на Web-сайте профаммы.
Последний, важный этап создания Web-сайта - оформление офаничений доступа для каталога /var/www/html/authors/, чтобы только уполномоченные пользователи имели доступ к файлам в этом каталоге. Чтобы сформулировать эти офаничения, нужно решить две задачи Во-первых, следует создать файл пользователей с перечнем необходимых пользователей (мы уже делали это в предыдущем парафафе, посвященном защите каталогов с использованием управления доступом). Нужно создать офаничения доступа для всех пользователей, которым предоставляется доступ к каталогу.
Во-вторых, нужно создать фуппу. Назовем ее authors, чтобы было проще выполнять работ по администрированию доступа к каталогу. Создается эта фуппа добавлением в файл групп (group) Web-сервера строки для фуппы, которая выглядит примерно так:
authors: author1 author2 author3
Эта строка указывает, что трем пользователям предоставляется доступ к каталогу.
Наконец, нужно создать файл .htaccess в каталоге /var/www/html/authors/ ("Auth" в приведенных ниже командах относится к аутентификации, authentication, а не к нашей группе authors).
AuthUserFile /etc/httpd/conf
/users AuthGroupFile /etc/httpd/conf
/groups require group authors
AuthName указывает отображаемую пользователю подсказку. AuthUserFile сообщает серверу, где искать список допустимых пользователей и паролей, a AuthGroupFile - где находится список допустимых групп. Наконец, команда require указывает, что только членам группы authors нужно предоставить доступ к каталогу.
Если пользователь попытается получить доступ к данному каталогу в начале сессии, он увидит диалоговое окно аутентификации, отображаемое браузером, подобное тому, которое отображает Netscape-(pnc. 32.5).
Рис. 32.5. Диалоговое окно аутентификации пользователя в Netscape
По умолчанию, если пользователь не пройдет аутентификацию, он получит страницу с сообщением об ошибке и предложением пройти аутентификацию. Для предоставления специализированной страницы, извещающей об ошибке аутентификации, следует отредактировать файл httpd.conf, чтобы указать на специализированное сообщение об ошибке, добавив в файл следующую строку:
ErrorDocument 401 /error.html
Этот элемент указывает, что при возникновении ошибки 401 (Authorization Required - Требуется аутентификация) сервер должен возвращать указанный URL вместо сообщения по умолчанию. Когда пользователь не пройдет аутентификацию, он получит модифицированную страницу с сообщением о неудачной аутентификации.