Раздел 6. Руководства, учебные пособия и инструкции RU EN Пункт 51. Динамический контент с CGI CGI (общий интерфейс шлюза) определяет способ взаимодействия веб-сервера с внешними программами, генерирующими контент, которые часто называют программами CGI или сценариями CGI. Это простой способ разместить динамическое содержимое на вашем веб-сайте, используя любой язык программирования, с которым вы лучше всего знакомы. Этот документ представляет собой введение в настройку CGI на веб-сервере Apache и начало написания программ CGI. Настройка Apache для разрешения CGIЧтобы ваши CGI-программы работали должным образом, вам необходимо настроить Apache для разрешения выполнения CGI. Есть несколько способов сделать это. Примечание. Если Apache был собран с поддержкой общих модулей, вам необходимо убедиться, что модуль загружен; в вашем apache2.conf вы должны убедиться, что
LoadModule
директива не была закомментирована. Правильно настроенная директива может выглядеть так:
Модули загрузки cgid_module/mod_cgid.soВ Windows или при использовании MPM без потоков, например prefork, правильно настроенная директива может выглядеть так: Модули загрузки cgi_module/mod_cgi.so ScriptAliasДиректива
Директива ScriptAlias "/cgi-bin/" "/usr/local/apache2/cgi-bin/" Показанный пример взят из Например, если
CGI вне каталогов ScriptAliasПрограммы CGI часто ограничиваются Есть два шага, чтобы разрешить выполнение CGI в произвольном каталоге. Во-первых, Явное использование параметров для разрешения выполнения CGIВы можете явно использовать эту <Каталог "/usr/local/apache2/htdocs/somedir"> Опции +ExecCGI </Каталог> Приведенная выше директива указывает Apache разрешить выполнение файлов CGI. Вам также нужно будет сообщить серверу, какие файлы являются файлами CGI. Следующая AddHandler cgi-скрипт .cgi .pl файлы .htaccessВ Каталоги пользователейЧтобы разрешить выполнение программы CGI для любого файла, оканчивающегося на
<Каталог "/home/*/public_html"> Опции +ExecCGI AddHandler cgi-скрипт .cgi </Каталог> Если вы хотите указать <Каталог "/home/*/public_html/cgi-bin"> Опции ExecCGI cgi-скрипт SetHandler </Каталог> Написание CGI-программыЕсть два основных различия между «обычным» программированием и программированием CGI. Во-первых, всем выводам вашей CGI-программы должен предшествовать заголовок MIME-типа . Это заголовок HTTP, который сообщает клиенту, какой контент он получает. В большинстве случаев это будет выглядеть так: Во-вторых, ваш вывод должен быть в формате HTML или в каком-либо другом формате, который сможет отображать браузер. В большинстве случаев это будет HTML, но иногда вы можете написать программу CGI, которая выводит изображение в формате gif или другое содержимое, отличное от HTML. Помимо этих двух вещей, написание CGI-программы будет очень похоже на любую другую программу, которую вы могли бы написать. Ваша первая программа CGIНиже приведен пример программы CGI, которая выводит одну строку в ваш браузер. Введите следующее, сохраните его в файл с именем #!/USR/бен/перл print "Тип контента: text/html\n\n"; напечатать "Привет, мир."; Даже если вы не знакомы с Perl, вы сможете увидеть, что здесь происходит. Первая строка сообщает Apache (или любой другой оболочке, под которой вы работаете), что эту программу можно выполнить, передав файл интерпретатору, находящемуся по адресу Если вы откроете свой любимый браузер и скажете ему получить адрес или куда бы вы ни поместили свой файл, вы увидите, что
Но это все еще не работает!Есть четыре основные вещи, которые вы можете увидеть в своем браузере, когда пытаетесь получить доступ к своей программе CGI из Интернета:
Права доступа к файламПомните, что сервер работает не так, как вы. То есть, когда сервер запускается, он работает с разрешениями непривилегированного пользователя — обычно Кроме того, если ваша программа читает или записывает какие-либо другие файлы, эти файлы должны иметь правильные разрешения, чтобы разрешить это. Информация о пути и средаКогда вы запускаете программу из командной строки, у вас есть определенная информация, которая передается оболочке без вашего участия. Например, у вас есть Когда программа запускается через веб-сервер как программа CGI, она может не иметь того же файла Обычным проявлением этого является путь к интерпретатору скриптов (часто #!/USR/бен/перл Убедитесь, что это действительно путь к интерпретатору. При редактировании сценариев CGI в Windows к пути интерпретатора могут добавляться символы конца строки. Убедитесь, что файлы затем передаются на сервер в режиме ASCII. Невыполнение этого требования может привести к появлению предупреждений ОС «Команда не найдена» из-за того, что нераспознанный символ конца строки интерпретируется как часть имени файла интерпретатора.Отсутствующие переменные средыЕсли ваша CGI-программа зависит от нестандартных переменных среды, вам необходимо убедиться, что эти переменные передаются Apache. Если вы пропускаете заголовки HTTP из среды, убедитесь, что они отформатированы в соответствии с RFC 2616, раздел 4.2: имена заголовков должны начинаться с буквы, за которой следуют только буквы, цифры или дефис. Любой заголовок, нарушающий это правило, будет автоматически удален. Ошибки программыВ большинстве случаев сбой программы CGI происходит из-за проблемы с самой программой. Это особенно верно, когда вы освоите этот материал CGI и больше не будете совершать две вышеуказанные ошибки. Первое, что нужно сделать, это убедиться, что ваша программа запускается из командной строки, прежде чем тестировать ее через веб-сервер. Например, попробуйте: (Не вызывайте Первое, что вы увидите, написанное вашей программой, должно быть набором заголовков HTTP, включая Журналы ошибокЖурналы ошибок — ваш друг. Все, что идет не так, создает сообщение в журнале ошибок. Вы всегда должны смотреть туда в первую очередь. Если место, где вы размещаете свой веб-сайт, не позволяет вам получить доступ к журналу ошибок, вам, вероятно, следует разместить свой сайт в другом месте. Научитесь читать журналы ошибок, и вы обнаружите, что почти все ваши проблемы быстро выявляются и быстро решаются. SuexecПрограмма поддержки suexec позволяет запускать CGI-программы с разными разрешениями пользователя, в зависимости от того, на каком виртуальном хосте или домашнем каталоге пользователя они расположены. Suexec имеет очень строгую проверку разрешений, и любой сбой в этой проверке приведет к сбою ваших CGI-программ с Чтобы проверить, используете ли вы suexec, запустите Если вы полностью не понимаете suexec, вам не следует его использовать. Чтобы отключить suexec, просто удалите (или переименуйте) Что происходит за кулисами?По мере того, как вы становитесь более продвинутыми в программировании CGI, вам будет полезно узнать больше о том, что происходит за кулисами. В частности, как браузер и сервер взаимодействуют друг с другом. Потому что, хотя написать программу, которая печатает «Hello, World.», очень хорошо, это не особенно полезно. Переменные средыПеременные среды — это значения, которые плавают вокруг вас, когда вы используете свой компьютер. Это полезные вещи, такие как ваш путь (где компьютер ищет фактический файл, реализующий команду, когда вы ее вводите), ваше имя пользователя, тип вашего терминала и так далее. Чтобы получить полный список ваших обычных, повседневных переменных среды, введите
Во время транзакции CGI сервер и браузер также устанавливают переменные среды, чтобы они могли взаимодействовать друг с другом. Это такие вещи, как тип браузера (Netscape, IE, Lynx), тип сервера (Apache, IIS, WebSite), имя выполняемой программы CGI и так далее. Эти переменные доступны программисту CGI и составляют половину истории взаимодействия клиент-сервер. Полный список необходимых переменных находится в документе Common Gateway Interface RFC. Эта простая программа Perl CGI будет отображать все передаваемые переменные среды. Две аналогичные программы включены в
#!/USR/бен/перл использовать строгий; использовать предупреждения; print "Тип контента: text/html\n\n"; foreach мой ключ $ (ключи %ENV) { print "$key --> $ENV{$key}<br>"; } STDIN и STDOUTДругая связь между сервером и клиентом происходит через стандартный ввод ( Когда вы «Особый формат» очень прост. Имя поля и его значение соединяются знаком равенства (=), а пары значений объединяются амперсандом (&). Неудобные символы, такие как пробелы, амперсанд и знак равенства, преобразуются в их шестнадцатеричный эквивалент, чтобы не портить работу. Вся строка данных может выглядеть примерно так: Иногда вы также увидите этот тип строки, добавленной к URL-адресу. Когда это будет сделано, сервер поместит эту строку в переменную среды с именем
Затем ваша программа отвечает за разбиение этой строки на полезную информацию. К счастью, существуют библиотеки и модули, которые помогут вам обрабатывать эти данные, а также управлять другими аспектами вашей CGI-программы. Модули/библиотеки CGIКогда вы пишете CGI-программы, вам следует подумать об использовании библиотеки кода или модуля, который сделает за вас большую часть черновой работы. Это приводит к меньшему количеству ошибок и более быстрому развитию. Если вы пишете программы CGI на Perl, модули доступны на CPAN. Наиболее популярным модулем для этой цели является Если вы пишете CGI-программы на C, у вас есть множество вариантов. Одной из них является Для дополнительной информацииТекущая спецификация CGI доступна в документе RFC Common Gateway Interface. Когда вы отправляете вопрос о возникшей у вас проблеме с CGI в список рассылки или в группу новостей, убедитесь, что вы предоставили достаточно информации о том, что произошло, что вы ожидали, и чем на самом деле было по-другому. на каком сервере вы работаете, на каком языке была написана ваша CGI-программа и, если возможно, код нарушения. Это значительно упростит поиск вашей проблемы. Обратите внимание, что вопросы о проблемах с CGI никогда не следует размещать в базе данных ошибок Apache, если только вы не уверены, что нашли проблему в исходном коде Apache. |