CGI - FAQteam

В этом разделе находится все, что связано с CGI, SSI, ну и вообще со всем, что вроде-бы как творится на сервере, но чудесным (или безобразным ;) образом выплескивается на наши экраны.

  1. Что такое CGI.
  2. На каком языке писать скрипты.
  3. Объектно-ориентированные скрипты.
  4. Об 'Ошибке 404' и ее обработке.
  5. Стоит ли устанавливать русский Апач.
  6. Как установить пароль на папку.
  7. Как при помощи серверного языка автоматизировать создание web-галереи.
  8. Про правильную работу с SSI-переменными.
  9. Как отправить форму по e-mail.
  10. Как при помощи SSI упростить обновление и изменение сайта .

Вопрос:  Что такое CGI и зачем мне все это нужно, если я не умею программировать, да и учиться на старости лет нет особого желания?

Ответ: CGI (Common Gateway Interface) - это шлюз, с помощью которого web-сервер может взаимодействовать с другими программами, работающими на этом сервере. Например, если вы увидели на каком-нибудь сайте кнопку с надписью "Жми!", и по неосторожности нажали на нее, то так и знайте - все данные, которые вы легкомысленно ввели в поле, расположенное рядом с кнопкой, тут же будут обработаны CGI-программой и переданы в компетентные органы. ;)

Зачем это нужно вам? А где вы сейчас увидите сайт, на котором нет хотя бы счетчика или формы опроса?

Чтобы воспользоваться всеми прелестями CGI, совсем не обязательно самому уметь программировать. Сейчас в сети можно найти сколько угодно бесплатных скриптов с достаточно подробным описанием их установки на сервер. Единственное условие - вам нужно иметь разрешение запускать программы на сервере.


Вопрос:  Если я все-таки решил сам заняться программированием CGI, то на каком языке мне лучше всего писать скрипты и какие из них умеют "разговаривать" с БД?

Ответ: Это напрямую зависит от назначения скрипта и наличия определенного интерпретатора на вашем сервере.

Perl (Practical Extraction and Report Language) однозначно самый популярный, однако в профессиональной среде он потихоньку уступает место другим, более продвинутым движкам типа PHP3, Cold Fusion и ASP.

Тем не менее, если вашей задачей не является построение огромного динамического сайта типа microsoft.com или amazon.com, и вы хотите всего-лишь завести собственную гостевую книгу, то Perl - наиболее вероятный кандидат для выполнения этой задачи.

Если вы имеете некоторый опыт традиционного программирования, то ничто не мешает создавать CGI-программы на компилируемых языках типа C/C++ или Visual Basic. При этом практически никакой специальной настройки сервера не требуется. Самым производительным решением будет С++, однако различия в скорости между интерпретируемыми и компилируемыми языками настолько малы, что этот вопрос можно считать риторическим.

Что касается переносимости, то Perl существует для большинства платфрм, от Linux до VAX VMS. Также, PHP3 компилируется на любой машине имеющей POSIX-совместимый компилятор. Фактически, при наличии достаточного обьема памяти PHP3 можно скомпилировать даже на Palm Pilot'e.

А с базами данных умеют общаться практически все, только в разной степени. Большинство языков, работающих под Windows, типа ASP "разговаривают" только через ODBC. При наличии ODBC драйвера для нужной БД соместимость практически обеспечена. Некоторые языки являются более продвинутыми в этой области. Например, PHP3 подключается к БД типа MySQL, PostgreSQL и Oracle по их "родным" протоколам типа SQL*Net для Oracle, что обеспечивает скорость в несколько сотен раз выше оной по ODBC.

 Примечания: Alexander S. Tereschenko в письме в редакцию от 14.05.00 говорит:

  1. Есть 3 фишки, которые ускоряют Perl: modperl для Apache, PerlEx для Windows и Cgi:Fast, которые решают проблемы быстродействия языка и тут amazon.com уже вполне достижим.
  2. Perl также компилируется на PalmPilot :-)
  3. Количество баз данных, которые Perl поддерживает native измерению просто не поддается! См. http://www.cpan.org или http://www.perl.com/perl/

Вопрос:  Имеет ли смысл разрабатывать ОО (Обьектно Ориентированные) скрипты CGI?

Ответ: Да, даже очень. Большинство современных языков являются объектно-ориентированными и поэтому могут свободно использовать классы написанные кем-то ранее. При большом обьеме проекта это может сохранить уйму времени. Однако, нужно помить, что многие языки лишь эмулируют ОО. Так, например, в Perl обьекты явяются обычными массивами и поэтому никакой скорости скрипту не придают.

 Примечания: Alexander S. Tereschenko в письме в редакцию от 14.05.00 говорит, что Perl 5.6 не эмулирует объекты.


Вопрос:  При отсутствии файла на сервере выдается какая-то дурацкая страничка с ошибкой. А можно ли мне вставить туда мой любимый переливающийся бэкграунд, фотографию моего попугая или еще что-нибудь полезное (например, имя отсутствующего файла)?

Ответ: Представьте себе ситуацию: ходит себе посетитель по вашему сайту, на ссылки кликает, окна открывает... И вдруг -- видит, в одном - сообщение на бледном default фоне:

Not Found
The requested URL /somepath/pivo.html was not found on this server.
Apache/1.3.X Server at www.some.net Port XX

Эта фраза, так много говорящая посетителю без знания английского, автоматически генерируется сервером, если запрошен документ с URL www.some.net/somepath/pivo.html, которого нет на сервере. Причины? Линк битый или букмарк устарел. Или посетитель набирал адрес вручную и очепятка вышла. Или пиво кончилось...

Особо вежливые вебмастера в таких случаях не любят пугать юзера бледным техническим текстом, а создают в каталоге сервера файл .htaccess (если его там еще нет), и помещают туда строку:

ErrorDocument 404 /path/error.html

И теперь сервер во всех случаях ошибки 404 ("документ не найден") выдает посетителю заготовленную старательным вебдизайнером страницу error.html. На этой странице в фирменном для ресурса стиле авторы извиняются (что хуже, чем целые линки, но лучше, чем ничего), объясняют посетителю, что запрошенной страницы здесь нет и что теперь с этим делать. Например, пожаловаться на email вебмастера о плохом обслуживании или перейти на главную страницу ресурса. Некоторые особо продвинутые вставляют на этой же error.html небольшой поисковик или карту сайта...

Если ваш хостинг позволяет использовать SSI (server-side includes) или php, то можно не только извиниться, но и напомнить посетителю, какого именно "Пива нет" (если он, посетитель, уже успел заблудиться в открытых окнах вашего сайта и в упор не помнит, с какой страницы линк привел его к "Ошибке 404"). И просить его отправить вебмастеру уже подготовленное письмо об ошибке.

Для этого файл error.shtml (*.shtml - стандартное расширение файлов, которые будут обрабатываться сервером на предмет SSI-инструкций) должен содержать:

<p>Извините, пива марки &quot;<!--#echo var="REQUEST_URI" -->&quot; нет!</p>
<p>Пишите в
<a href="mailto:webmaster@some.net?subject=error404&body=<!--#echo
var="REQUEST_URI" --> not found;
link from <!--#echo var="HTTP_REFERER" -->">Книгу Жалоб</a>.
Вебмастера уволят.</p>

Решение с помощью php (если он у провайдера хостинга есть): в .htaccess пишется

ErrorDocument 404 /path/error.phtml

В теле файла error.phtml (стандартно *.phtml-файлы обрабатываются на предмет php-инструкций ) соответственно:

<p>Извините, файл &quot;<? echo $REQUEST_URI ?>&quot; не найден...</p>
<p>Пишите в
<a href="mailto:webmaster@some.net?subject=error404&body=<? echo
$REQUEST_URI ?> not found;
link from <? echo $HTTP_REFERER ?>">Книгу Жалоб</a>.
Вебмастер исправит.</p>

В обоих (*.shtml и *.phtml) случаях пользователь увидит извинение; а если кликнет на сылку "mailto:", то в окне его почтового клиента появится уже заполненное сообщение об ошибке: чего нет, откуда на это "то, чего нет" ссылка.

 Примечания: В принципе, вы можете ничего перечисленного выше не делать. Пускай учат английский!..


Вопрос:  Имеет ли смысл ставить Russian Apache (http://apache.lexa.ru/) -- я слышал(а), он лучше работает с русскими кодировками?

Ответ: Этот httpd имеет систему определения платформы клиента исходя из имени броузера (User Agent) и подстановки соответствующей кодировки; кроме того имеет принудительную перекодировку по портам. Если к вам часто ходят люди c броузерами, не поддерживающими разнообразие кириллических кодировок, ставьте его без раздумий. Если вы верите в прогресс броузеров и кодировки, как проблему броузеров, он вам не нужен, а лишь будет мешать.


Вопрос:  У меня на сайте хранится секретная информация для узкого круга людей (фотографии, музыка, видеоролики, тексты и т.п.). Как мне создать пароль на папку и все вложенные в неё, чтобы только они могли её читать?

Ответ: Необходимо создать в директории, начиная с которой будет спрашиваться пароль, файл .htaccess следующего содержания:

AuthUserFile /usr/local/apache/htdocs/my_site/secret/.htpasswd
AuthName "Текст, который будет отображаться в окне запроса пароля"
AuthType Basic
Require user user_name1 user_name2

В AuthUserFile необходимо указать полный путь к файлу .htpasswd.

И соответственно файл .htpasswd, в котором будет храниться user_name и пароль в зашифрованном виде:

user_name1:bzURGDr.ETR9k
user_name2:ETbzURGD8rR9k

Зашифровать пароль можно командой htpasswd -c .htpasswd user_name1, выполнив её на вашем сервере (если есть доступ к консоли).

 Примечания: Если вы работаете под Windows, то при создании файлов .htaccess и .htpasswd на локальной машине могут возникнуть некоторые сложности. Если у вас принципиально нет ничего, кроме Блокнота, то создать эти файлы можно выполнив команду notepad d:\path\.htaccess в консоли Windows или из меню Start->Run. Воспользовавшись встроенным редактором FAR manager, вы сможете проделать все это несколько быстрее.

Чтобы зашифровать пароли для .htpasswd, можно применить утилиту htpasswd.exe, входящую в поставку Apache.

Для этой цели существуют и снабженные графическим интерфейсом Windows-приложения, например, Encode UNIX Password фирмы Magenta Systems. Эта небольшая бесплатная программа позволит вам с легкостью зашифровать и при желании сохранить в .htpasswd как один, так и несколько паролей. Работать с ней можно и из командной строки.

Зашифровать пароль можно также предлагаемыми бесплатными сервисами.

Бесплатный сервис подойдёт вам только в том случае, если на сервере используется стандартный метод шифрования. Если, например, у вас на сервере установлена система Kerberos (или другая нестандартная), у которой сложнее алгоритм шифрования, то шифрование необходимо произвести на самом сервере. Если у вас нет привилегий, лучше обратиться к вашему системному администратору.

 Внимание: В целях безопасности пользоваться бесплатными сервисами не рекомендуется.

Файл с паролями не должен быть доступен через http, поэтому лучше всего создать для таких файлов отдельную директорию, к которой не могут иметь доступ посетители вашего сайта.

 Что еще почитать: Об 'Ошибке 404' и её обработке.


Вопрос:  Что бы такое сделать, чтобы потом ничего не делать?

Ответ: Это можно реализовать с помощью, например, PHP.

Формализуем задачу:

  1. хочется иметь веб-галерею картинок (например, рисунков);
  2. хочется, чтобы по клику на "ноготок" (thumbnail, миниатюрная копия картинки в галерее, служащая ссылкой на полноформатную картинку) открывалось новое окно с картинкой в "полный рост";
  3. очень НЕ хочется, чтобы картинки открывались в окнах с одинаковым именем, так как тогда посетитель не может кликнуть сразу на две-три понравившиеся работы;
  4. очень НЕ хочется при появлении новых картинок лезть в редактор и править html- файл, вставляя новую иконку-"ноготок" и прописывая правильное имя и размеры для открывающегося окна...

Вообще ХОЧЕТСЯ залить на сервер саму картинку "*.jpg", ee уменьшенную копию "*.gif", и забыть об этом. Пусть серверы работают! У них процессоров много...

Для получения того, что хочется, необходимо "залить" в директорию вот этот файл, предварительно изменив его имя и подправив что надо, руководствуясь подробными комментариями в файле... И смело садиться учиться рисовать.

 Примечания: Действующую модель паровоза в масштабе 1:1 можно увидеть по адресу http://onthe.kiev.ua/zanderGround/


Вопрос:  Я немного запутался в использовании SSI переменных. Не подскажете, как их правильно использовать?

Ответ: Основная путаница в SSI-переменных может быть в знаке доллара ($), который ставится перед переменной, как её определитель. Дело в том, что при задании переменной он не используется, и отсюда возникает вся путаница:

<!--#set var="X" value="значение" -->

Во всех же остальных случаях переменную следует предварять этим знаком: $X.

Следующий тонкий момент - сложные условия с переменными. Знак доллара является специальным символом, поэтому частой проблемой есть его неправильное определение сервером. Чтобы избежать этого, есть два способа - заключать переменную в фигурные скобки:

<!--#include virtual="/cgi-bin/get.pl?what=${WHAT}&where=${WHERE}" -->

Или же предварять знак доллара обратной косой (backslash):

<!--#if expr="$X = \$Y" -->

Вот в принципе и все основные тонкости в использовании SSI переменных. При нахождении новых эта статья будет пополняться.

 Примечания: Разные веб-сервера могут по-разному обрабатывать SSI-команды. Поэтому не бойтесь экспериментировать, если что-то не будет получатся.

 Внимание: Если вы заметили, перед символами конца SSI-команды "-->" везде стоит пробел. Дело в том, что не все серверы "понимают" команды без этого пробела. А те, которые понимают без пробела, нормально работают с пробелом. Так что рекомендуется его ставить всегда.

 Что еще почитать: Об 'Ошибке 404' и ее обработке.


Вопрос:  Я потратил 60 секунд на создание сайта на Народ.Ру. Сколько времени мне понадобится, чтобы сделать форму для регистрации посетителей?

Ответ: Ответ мог бы звучать очень просто: нисколько. Народ.Ру, как и многие другие предоставляющие бесплатный хостинг сайты, не разрешает использовать никаких средств серверной обработки.

Можно было бы распрощаться с мыслью о каких бы то ни было формах на таком сайте, однако есть один редко используемый, но единственно возможный в этом случае способ -- отправить форму по e-mail.

В качестве значения атрибута action можно использовать не только имя программы, производящей обработку формы на сервере, но и адрес электронной почты. Тогда при нажатии на кнопку Submit на основе данных формы будет определенным образом сформировано письмо и отправлено по адресу, указанному в action. Такая форма может выглядеть, к примеру, вот так:

<form action="mailto:me@mail.ru?subject=User%20Registration"
  method="post"
  enctype="text/plain">
Имя <input name="firstName"><br>
Фамилия <input name="lastName"><br>
Пожелания<br>
<textarea name="comments"></textarea><br>
<input type="submit" value="Отправить">
</form>

После нажатия кнопки "Отправить" будет отправлено письмо на адрес me@mail.ru с темой "User Registration", а текст письма будет выглядеть примерно вот так:

firstName=Вася
lastName=Пупкин
comments=Всех благ!

При создании формы обязательно нужно указывать method="post", иначе данные формы не будут автоматически вставлены в тело письма, а просто будет вызвана почтовая программа посетителя с заполненным полем "Кому" (To). Указывать enctype="text/plain", в принципе, необязательно, но если этого не сделать, то содержимое формы в закодированном виде будет включено в прикрепленный к письму файл, что может значительно затруднить обработку присланных данных вручную (с другой стороны, это может облегчить автоматическую обработку таких писем, так как данные пересылаются в стандартном urlencoded виде).

В дополнение к адресу в action желательно также добавить заголовок Subject, чтобы тема письма была осмысленной, а не просто какой-нибудь "Form posted from Microsoft Internet Explorer" -- это облегчит последующую сортировку таких сообщений.

 Примечания: Перед отправкой формы броузер выдаст посетителю предупреждение на тему безопасности и отключить появление этого предостережения, похоже, никак нельзя.

 Что еще почитать: RFC2368 - The mailto URL scheme


Вопрос:  У меня есть свой сайт на сервере у провайдера. Могу ли я себе упростить работу с ним, если провайдер разрешает мне использовать только SSI (Server Side Includes)?

Ответ: Даже при наличии только SSI вы сможете существенно упростить обновление, изменение структуры и даже глобальный редизайн сайта, а в качестве небольшого бонуса получить версии страниц для печати.

Предположим стандартную структуру контент-сайта: header (шапка: заголовок с логотипом), меню, контент-часть и footer (низ сайта). Пускай в соответствующих папках есть такие разделы: "О сайте" (/about/), "Дизайн" (/design/), "Веб-мастеринг" (/web/), "Программирование" (/programming/).

Создадим папку "ssi" (или другую на свой вкус) и положим туда файл menu.shtml с таким содержимым:

<!--#if expr="$DOCUMENT_URI=/\/about\//" -->
<a href ="/about/">О сайте</a>
<!--#else -->
<a href ="/about/" class="selected">О сайте</a>
<!--#endif -->
<br>
<!--#if expr="$DOCUMENT_URI=/\/web\//" -->
<a href ="/web/">Веб-мастеринг</a>
<!--#else -->
<a href ="/web/" class="selected">Веб-мастеринг</a>
<!--#endif -->
<br>
<!--#if expr="$DOCUMENT_URI=/\/design\//" -->
<a href ="/design/">Дизайн</a>
<!--#else -->
<a href ="/design/" class="selected">Дизайн</a>
<!--#endif -->
<br>
<!--#if expr="$DOCUMENT_URI=/\/programming\//" -->
<a href ="/programming/">Программирование</a>
<!--#else -->
<a href ="/programming/" class="selected">Программирование</a>
<!--#endif -->

Вкратце об этом файле: он будет отслеживать из какой папки запрошен документ и исходя из этого выделять текущий пункт меню. Переменная серверного окружения DOCUMENT_URI содержит в себе путь к документу от корневого каталога сайта, например "/about/index.shtml".

При выделении пунктов мы используем поиск по шаблону: искомая строка заключается в косые "//"; если требуется искать саму косую, ее на предварять обратной косой: "\/"). И строка <!--#if expr="$DOCUMENT_URI=/\/web\//" --> переводится на человеческий язык следующим образом: "если в переменной DOCUMENT_URI где-нибудь встречается "/web/", то...".

Свои минусы тут в том, что нельзя тогда создавать в папке web папку под названием design, иначе выделятся оба пункта меню. Если это имеет для вас значение, необходимо все условия заменить на <!--#if expr="$DOCUMENT_URI=/^\/web\//" -->, что будет учитывать только те случаи, когда путь в переменной начинается с "/web/".

По образу и подобию этого файла можно создать footer.shtml для альтернативного меню.

Теперь создадим в корневом каталоге index.shtml:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">

<!--#if expr="$DOCUMENT_URI=/\/about\//" -->
<!--#set var="TITLE" value="- О сайте" -->
<!--#endif -->
<!--#if expr="$DOCUMENT_URI=/\/web\//" -->
<!--#set var="TITLE" value="- Веб-мастеринг" -->
<!--#endif -->
<!--#if expr="$DOCUMENT_URI=/\/design\//" -->
<!--#set var="TITLE" value="- Дизайн" -->
<!--#endif -->
<!--#if expr="$DOCUMENT_URI=/\/programming\//" -->
<!--#set var="TITLE" value="- Программирование" -->
<!--#endif -->

<html>
<head>
<title>Мой сайт <!--#echo var="TITLE"--> <!--#include virtual="title.shtml" --></title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">

<!--#if expr="$QUERY_STRING=print" -->

<!-- Это будет версия для печати -->
<link rel="STYLESHEET" href="/css/print.css" type="text/css">
</head>

<body>
<h1><!--#echo var="TITLE" --></h1>
<div class="text"><!--#include virtual="text.shtml" --></div>

<!--#else -->

<!-- Это сам сайт -->
<link rel="STYLESHEET" href="/css/default.css" type="text/css">
</head>

<body>
<img src="logo.gif" width="200" height="200" alt="Мой сайт">
<h1><!--#echo var="TITLE" --></h1>
<div class="menu"><!--#include virtual="/ssi/menu.shtml" --></div>
<div class="text"><!--#include virtual="text.shtml" --></div>
<div class="footer"><!--#include virtual="/ssi/footer.shtml" --></div>

<!--#endif -->

</body>
</html>

Из текущей папки, в которой размещен index.shtml, будут браться файлы title.shtml (содержимое которого будет составной частью заголовка окна, а также использоваться в названии статьи на самой странице) и text.shtml - сам контент страницы. Все остальные файлы создаются один раз и надолго.

Положив в footer.shtml ссылку <a href="?print">Версия для печати</a>, вы всегда сможете получать свежую версию статьи для печати.

Теперь о том, как это работает. Вначале мы в зависимости от названия папки, из которой вызывается документ, устанавливаем часть заголовка. После этого выодим заголовок окна таким образом: Название сайта + Название раздела + Текст в файле title.shtml из текущего каталога. После этого мы смотрим на переменную QUERY_STRING (содержит часть строки вызова документа после знака вопроса "?"), и если она содержит "print", формируем версию для печати, во всех других случаях - выдаем страницу с полным обрамлением. В эту страницу мы вставляем меню и нижнюю часть сайта из каталога "/ssi/", а файлы text.shtml и title.shtml берутся из текущего каталога.

Как только вы все это сделаете, без промедления хватайте пиво и бегите к сисадмину провайдера. Упросите его сделать с файла index.shtml одну единственную символическую ссылку (symbolic link) и положить в любой каталог вашего сайта. Подобную ссылку, к сожалению, невозможно создать по FTP. После того, как ее создадут вы можете создавать любую папку в одном из каталогов раздела, копировать туда эту ссылку (можно и по FTP), класть туда text.shtml со статьей и title.shtml с заголовком - и все, статья готова к выпуску.

Преимущество этого метода в том, что в каждой папке будет лежать не сам файл index.shtml, а ссылки на него. Таким образом, изменив что-либо в index.shtml корневого каталога, вы измените весь сайт.

При определенном подходе к созданию статей (используя структурные теги из репертуара Strict HTML), вы сможете просто заменив корневой index.shtml и CSS полностью сменить дизайн ресурса!

 Примечания: Если уговорить админа не удастся (например, он сегодня на пиво уже смотреть не может), вы всегда сможете копировать сам файл index.shtml в папки со статьями, но в таком случае при смене чего-либо в основном файле, его придется вручную тиражировать по всем каталогам

 Проверено на : Apache Web Server 1.3.12


Valid HTML 4.0! Made with CSS
Все вопросы и пожелания сюда или сюда