<-
Apache > HTTP Server > Documentation > Version 2.0 > How-To / Tutorials

Apache Обучающая программа: Динамическое Содержание с CGI

top

Introduction

CGI (Общий Интерфейс Ворот) определяет путь для сервера сети, чтобы взаимодействовать с внешними производящими содержание программами, которые часто упоминаются как программы CGI или подлинники CGI. Это является самым простым, и самым обычным, путь поместить динамическое содержание в ваш вебсайт. Этот документ будет введением в настраивание CGI на вашем Apacheском сервере сети, и начинающем письме программы CGI.

top

Configuring Apache to permit CGI

чтобы заставить ваши программы CGI работать должным образом, Вы будете должны формировать Apacheа, чтобы разрешить выполнение CGI. Есть несколько способов сделать это.

ScriptAlias

ScriptAlias директива говорит Apacheу, что специфический справочник обойден для программ CGI. Апач предположит, что каждый файл в этом справочнике - программа CGI, и попытается выполнить это, когда, который специфический ресурс требует клиент.

ScriptAlias директива похожа:

ScriptAlias /cgi-bin/ /usr/local/apache2/cgi-bin/

показанный пример - от вашего неплатежа httpd.conf файл конфигурации, если Вы устанавливали Apacheа в местоположении по умолчанию. ScriptAlias директива очень походит Alias директива, которая определяет приставку URL, которая состоит в том, чтобы к нанесенному на карту к специфическому справочнику. Alias и ScriptAlias обычно используются для справочников, которые являются вне DocumentRoot справочник. Различие между Alias и ScriptAlias является этим ScriptAlias имеет добавленное подразумевение, что все, под которым приставку URL будут считать программой CGI. Так, пример выше говорит Apacheа что любой запрос о начинающемся ресурсе /cgi-bin/ нужно служить от справочника /usr/local/apache2/cgi-bin/ , и нужно рассмотреть как программа CGI.

например, если URL http://www.example.com/cgi-bin/test.pl требуется, Apache попытается выполнить файл /usr/local/apache2/cgi-bin/test.pl и возвращение продукция. Конечно, файл должен будет существовать, и быть выполнимым, и продукция возвращения специфическим способом, или Apache возвратит ошибочное сообщение.

CGI outside of ScriptAlias directories

программы CGI часто ограничиваются ScriptAlias 'справочники редактора для соображений безопасности. Таким образом, администраторы могут сильно управлять, кому разрешают использовать программы CGI. Однако, если надлежащие меры безопасности приняты, нет никакой причины, почему программами CGI нельзя управлять от произвольных справочников. Например, Вы можете желать позволить пользователям иметь содержание сети в их домашних каталогах с UserDir директива. Если они хотят иметь их собственные программы CGI, но не иметь доступа к основному cgi-bin справочник, они будут должны быть в состоянии управлять программами CGI в другом месте.

есть два шага к позволению выполнения CGI в произвольном справочнике. Сначала, cgi-script тренер должен быть активизирован, используя AddHandler или SetHandler директива. Во вторых, ExecCGI должен быть определен в Options директива.

Explicitly using Options to permit CGI execution

Вы могли явно использовать Options директива, в вашем главном файле конфигурации сервера, чтобы определить, что выполнение CGI разрешалось в специфическом справочнике:

<Directory /usr/local/apache2/htdocs/somedir>
Options +ExecCGI
</Directory>

вышеупомянутая директива говорит Apacheу разрешать выполнение файлов CGI. Вы будете также должны сказать сервер, какие файлы являются файлами CGI. Следующий AddHandler директива говорит серверу рассматривать все файлы с cgi или pl расширение как программы CGI:

AddHandler cgi-script .cgi .pl

.htaccess files

.htaccess tutorial показы, как активизировать программы CGI, если Вы не имеете доступа к httpd.conf .

User Directories

позволять выполнение программы CGI для любого файла, заканчивающегося в .cgi в справочниках пользователей, Вы можете использовать следующую конфигурацию.

<Directory /home/*/public_html>
Options +ExecCGI
AddHandler cgi-script .cgi
</Directory>

если Вы желаете определять a cgi-bin подсправочник справочника пользователя, где все будут рассматривать как программа CGI, Вы можете использовать следующий.

<Directory /home/*/public_html/cgi-bin>
Options ExecCGI
SetHandler cgi-script
</Directory>

top

Writing a CGI program

есть два главных различия между "регулярным" программированием, и программированием CGI.

сначала, всей продукции из вашей программы CGI нужно предшествовать ударом головой ТИПА ПАНТОМИМЫ. Это - удар головой HTTP, который говорит клиенту, какое содержание это получает. Большинство времени, это будет похожо:

Content-type: text/html

во-вторых, ваша продукция должна быть в HTML, или некотором другом формате, который браузер будет в состоянии показать. Большинство времени, это будет HTML, но иногда Вы могли бы написать программу CGI, которую продукции изображение джифа, или другой не-HTML удовлетворяют.

кроме тех двух вещей, пишущий программу CGI будет много походить на любую другую программу, которую Вы могли бы написать.

Your first CGI program

следующее - пример программа CGI, которая печатает одну линию к вашему браузеру. Напечатайте в следующем, сэкономите это к названному файлу first.pl , и вставленный в это ваш cgi-bin справочник.

#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "Hello, World.";

даже если Вы не знакомы с Perl, Вы должны быть в состоянии видеть то, что случается здесь. Первая линия говорит Apacheа (или безотносительно снаряда, которым Вы, случается, бежите под), что эта программа может быть выполнена, кормя файл переводчику, найденному в местоположении /usr/bin/perl . вторая линия печатает декларацию довольного типа, мы говорили о, сопровождаемый двумя переводами каретки newline пары. Это помещает чистую линию после удара головой, указывать конец ударов головой HTTP, и начала тела. Третья линия печатает вереницу "Привет, Мир.". И это - конец этого.

если Вы открываете ваш любимый браузер и говорите этому получать адрес

http://www.example.com/cgi-bin/first.pl

или везде, где Вы помещаете ваш файл, Вы будете видеть одну линию Hello, World. появитесь в вашем окне браузера. Это не является очень захватывающим, но как только Вы получаете ту работу, Вы будете иметь хороший шанс на получение примерно чем - нибудь работа.

top

But it's still not working!

есть четыре основных вещи, которые Вы можете видеть в вашем браузере, когда Вы пробуете получить доступ к вашей программе CGI от сети:

продукция вашей программы CGI
большой! Это означает, что все работало прекрасное. Если продукция правильна, но браузер не обрабатывает это правильно, удостоверьтесь, что Вы имеете правильное Content-Type набор в вашей программе CGI.
исходный текст вашей программы CGI или "ПОЧТОВОГО Метода Не Позволенное" сообщение
это означает, что Вы должным образом не формировали Apacheа, чтобы обработать вашу программу CGI. Перечитайте секцию на configuring Apache и попытка находить, что Вы пропустили.
сообщение, начинающееся с "Запрещенного"
это означает, что есть проблема разрешений. Проверьте Apache error log и секция ниже на file permissions .
сообщение, говоря "Внутреннюю Ошибку Сервера"
если Вы проверяете Apache error log , Вы вероятно найдете, что это говорит "Преждевременный конец ударов головой подлинника", возможно наряду с ошибочным сообщением, произведенным в соответствии с вашей программой CGI. В этом случае, Вы будете хотеть проверить каждый из ниже секций, чтобы видеть то, что могло бы препятствовать вашей программе CGI испускать надлежащие удары головой HTTP.

File permissions

помнить, что сервер не бежал как Вы. Таким образом, когда сервер запускает, это бежит с разрешениями непривилегированного пользователя - обычно nobody , или www - и таким образом это будет нуждаться в дополнительных разрешениях выполнить файлы, которые принадлежат Вам. Обычно, способ давать файл достаточные разрешения, которые будут выполнены nobody должен дать каждого, выполняют разрешение на файле:

chmod a+x first.pl

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

Path information and environment

когда Вы управляете программой от вашей линии команды, Вы имеете определенную информацию, которую передают к снаряду без Вас думающий об этом. Например, Вы имеете a PATH , который говорит снаряд, где это может искать файлы, на которые Вы ссылаетесь.

когда программа пробегает сервер сети как программа CGI, это, возможно, не имеет того же самого PATH . любые программы, которые Вы призываете в вашей программе CGI (как sendmail , например), будет должный быть определены полной дорожкой, так, чтобы снаряд мог найти их, когда это пытается выполнить вашу программу CGI.

общее проявление этого - дорожка к переводчику подлинника (часто perl ) обозначенный в первой линии вашей программы CGI, которая будет выглядеть кое-что как:

#!/usr/bin/perl

удостоверьтесь, что это - фактически дорожка к переводчику.

кроме того, если ваша программа CGI зависит от другого environment variables , Вы будете должны уверить, что те переменные передает Apache.

Program errors

большинство времени, когда программа CGI терпит неудачу, это - из-за проблемы с программой непосредственно. Это особенно верно, как только Вы приобретаете навык этого материала CGI, и больше не делаете вышеупомянутые две ошибки. Первое необходимое действие состоит в том, чтобы удостовериться, что ваша программа бежит от линии команды перед испытанием этого через сервер сети. Например, пробуйте:

cd /usr/local/apache2/cgi-bin
./first.pl

(не звоните perl переводчик. Снаряд и Apache должны найти переводчика, использующего path information на первой линии подлинника.)

первой вещью, которую Вы видите написанный в соответствии с вашей программой, должен быть ряд ударов головой HTTP, включая Content-Type , сопровождаемый чистой линией. Если Вы будете видеть что - нибудь еще, то Apache возвратится Premature end of script headers ошибка, если Вы пробуете управлять этим через сервер. См. Writing a CGI program выше для большего количества деталей.

Error logs

ошибочные регистрации - ваш друг. Что - нибудь, что идет не так, как надо, производит сообщение в ошибочной регистрации. Вы должны всегда выглядеть там первыми. Если место, где Вы принимаете гостей за вашим вебсайтом, не разрешает Вам доступ к ошибочной регистрации, Вы должны вероятно принять гостей за вашим участком где-то в другом месте. Учитесь читать ошибочные регистрации, и Вы найдете, что почти все ваши проблемы быстро идентифицированы, и быстро решены.

Suexec

suexec программа поддержки позволяет программам CGI управляться согласно различным пользовательским разрешениям, в зависимости от какого действительного хозяина или пользовательского домашнего каталога они расположены в. Suexec имеет очень строгую проверку разрешения, и любой отказ в той проверке приведет к вашим программам CGI, терпящим неудачу с Premature end of script headers .

проверять, используете ли Вы suexec, которым управляют apachectl -V и чек на местоположение SUEXEC_BIN . если Apache находит suexec набор из двух предметов там на запуске, suexec будет активизирован.

если Вы полностью не понимаете suexec, Вы не должны использовать это. Чтобы повредить suexec, просто удалите (или переименуйте), suexec набор из двух предметов, на который указывают SUEXEC_BIN и затем повторно начните сервер. Если, после чтения о suexec , Вы все еще желаете использовать это, затем бежите suexec -V находить местоположение suexec файла системного журнала, и использовать тот файл системного журнала, чтобы найти, какую политику Вы нарушаете.

top

What's going on behind the scenes?

поскольку Вы становитесь более передовыми в программировании CGI, станет полезно понять больше о том, что случается негласно. Определенно, как браузер и сервер общаются друг с другом. Поскольку, хотя очень хорошо написать программу, которая печатает "Привет, Мир.", это не особенно полезно.

Environment variables

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

в течение сделки CGI, сервер и браузер также устанавливают переменные окружающей среды, так, чтобы они могли общаться друг с другом. Они - вещи как тип браузера (Netscape, ТО ЕСТЬ, Рысь), тип сервера (Apache, IIS, Вебсайт), название программы CGI, которой управляют, и так далее.

эти переменные доступны для программиста CGI, и - половина истории коммуникации клиент-сервер. Полный список необходимых переменных - в http://hoohoo.ncsa.uiuc.edu/cgi/env.html .

этот простой Perl CGI программа покажет все переменные окружающей среды, которые раздаются. Две подобных программы включены в cgi-bin справочник Apacheского распределения. Отметьте, что некоторые переменные требуются, в то время как другие являются дополнительными, таким образом Вы можете видеть, что некоторые переменные перечисляли, которые не были в официальном списке. Кроме того, Apache обеспечивает много различных путей для Вас к add your own environment variables к основным, обеспеченным по умолчанию.

#!/usr/bin/perl
print "Content-type: text/html\n\n";
foreach $key (keys %ENV) {
print "$key --> $ENV{$key}<br>";
}

STDIN and STDOUT

другая коммуникация между сервером и клиентом случается по стандартному входу ( STDIN ) и стандартная продукция ( STDOUT ). В нормальном каждодневном контексте, STDIN означает клавиатуру, или файл, что программа дается, чтобы действовать на, и STDOUT обычно означает пульт или экран.

когда Вы POST форма сети к программе CGI, данные в той форме укутаны в специальный формат и поставляются вашей программе CGI STDIN . программа тогда может обработать те данные, как если бы это входило от клавиатуры, или от файла

"специальный формат" является очень простым. Полевое название и его ценность объединены с равнянием (=) признак, и пары ценностей объединены с амперсандом (&). Неудобные характеры как места, амперсанды, и равняются признакам, преобразованы в их эквивалентную ведьму так, чтобы они не делали работы клейким. Целая вереница данных могла бы выглядеть кое-что как:

name=Rich%20Bowen&city=Lexington&state=KY&sidekick=Squirrel%20Monkey

Вы будете иногда также видеть этот тип вереницы, приложенной к URL. Когда это сделано, сервер помещает ту вереницу в названную переменную окружающей среды QUERY_STRING . это назвало a GET запрос. Ваша форма HTML определяет ли a GET или a POST используется, чтобы поставить данные, устанавливая METHOD признак в FORM признак.

ваша программа тогда ответственна за то, что разделила ту вереницу на полезную информацию. К счастью, есть библиотеки и модули, доступные, чтобы помочь Вам обрабатывать эти данные, так же как обращаться с другими из аспектов вашей программы CGI.

top

CGI modules/libraries

когда Вы пишете программы CGI, Вы должны рассмотреть использование кодовой библиотеки, или модуля, сделать большинство работы ворчания для Вас. Это приводит к меньшему количеству ошибок, и более быстрому развитию.

если Вы пишете программы CGI в Perl, модули доступны на CPAN . самый популярный модуль с этой целью CGI.pm . Вы могли бы также рассмотреть CGI::Lite , который осуществляет минимальный набор функциональных возможностей, которые являются всем, что Вы нуждаетесь в большинстве программ.

если Вы пишете программы CGI в C, есть разнообразие вариантов. Один из них- CGIC библиотека, от http://www.boutell.com/cgic/ .

top

For more information

есть большое количество ресурсов CGI на сети. Вы можете обсудить проблемы CGI с другими пользователями на группе Usenet comp.infosystems.www.authoring.cgi . и - список адресатов серверов от Гильдии Авторов HTML - большой источник ответов на ваши вопросы. Вы можете узнать больше в http://www.hwg.org/lists/hwg-servers/ .

и, конечно, Вы должны вероятно прочитать спецификацию CGI, которая имеет все детали относительно операции программ CGI. Вы можете найти оригинальную версию в NCSA и есть обновленный проект в Common Gateway Interface RFC project .

когда Вы объявляете вопрос о проблеме CGI, которую Вы имеете, ли к списку адресатов, или к телеконференции, удостоверьтесь, что Вы обеспечиваете достаточно информации о том, что случилось, что Вы ожидали случаться, и как то, что фактически случилось, было отлично, каким сервером Вы бежите, какой язык ваша программа CGI была в, и, если возможно, кодекс оскорбления. Это сделает обнаружение вашей проблемы намного более простым.

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