Next Previous Contents

6. Web серверы

6.1 Как заставить WWW сервер исполнять CGI-программы?

Apache для Unix/Win32

Надо отредактировать конфигурационные файлы (я рассчитываю, что у вас default конфиги apache) (NB: Apache/1.3.6 и выше по умолчанию конфигурируется только файлом httpd.conf. Директивы все остались прежние, просто их слили в один файл)

Способ 1

srm.conf

Директива ScriptAlias

ScriptAlias /cgi-bin/ /usr/local/apache/cgi-bin/
и в файле access.conf прописать

<Directory /usr/local/apache/cgi-bin/>
Options ExecCGI 
</Directory> 
(если пригляделся, там нужно только раскоментировать опции) Это позволит вам помещать программы в каталог /usr/local/apache/cgi-bin/ и они будут видны по URL http://you/cgi-bin/program_name

Способ 2

Прописать

<Files *.cgi>
        SetHandler cgi-script
        Options ExecCGI
</Files>

и apache буде исполнять файлы с расширением .cgi из любого каталога как CGI-скрипты.

6.2 Мой CGI-скрипт не работает! Как установить причину?

Прежде чем читать дальше, убедитесь в том, что:

6.3 Ошибки HTTP 500 и 403. Что это значит и что с ними делать

error_log для того и служит, чтобы туда смотреть :-)

Ошибка 403 "Forbidden"

Возникает, если сервер не может отдать вам содержимое по причине отсутствия полномочий.

Проверьте:

Ошибка 500 "Internal Server Error"

Возникает в случае внутренней ошибки.

Проверьте:

Также, эта ошибка возникает, если CGI-программа завершилась с ненулевым кодом возврата, что часто встречается в случае некомпилируемости вашего скрипта perl'ом.

Совет: делайте use CGI::Carp qw(fatalsToBrowser) во время отладки, тогда вам выдадут сообщение об ошибке perl.

6.4 Почему $ENV{REMOTE_HOST} пуста?

apache устанавливает переменную окружения REMOTE_HOST, если ему разрешено проводить dns запросы для определения имени. Для 1.3.x по-умолчанию это выключено. Включается/выключается директивой HostNameLookups, которая может принимать 3 значения: on -- проводить запросы, off -- не запрашивать dns и double -- делать двойные запросы: запрашивать имя хоста, а затем по имени запрашивать ip адрес, для безопасности.

6.5 Почему $ENV{REMOTE_USER} пуста?

Переменная окружения REMOTE_USER устанавливается apache в случае, если скрипт защищен паролем. Как это сделать рассказано на http://www.apacheweek.com/features/userauth и http://www.apacheweek.com/features/dbmauth

6.6 Как получить пароль при http-авторизации?

Прописать

RewriteEngine   On
RewriteCond     %{HTTP:Authorization}   ^(.*)$ [NC]
RewriteRule     /.*             -       [E=HTTP_AUTHORIZATION:%1] 

в конфиг апача (Должен быть включен mod_rewite) и apache будет выставлять в окружение переменную $ENV{HTTP_AUTHORIZATION}.

Пример как ее декодировать:

#!/usr/bin/perl -w
use strict;
use MIME::Base64;

print "Content-Type: text/plain; charset=koi8-r\n\n";
# В $ENV{HTTP_AUTHORIZATION} сейчас нечто типа: 
# Basic YXBhdmVsOmZvb2Jhcg==

my ($type, $encoded) = split(/ /, $ENV{HTTP_AUTHORIZATION});
my ($login, $passw) = split(/:/, decode_base64($encoded));

print 
"Type: $type
Login: $login
Password: $passw
";

Учтите, что на некоторых системах, чужие юзеры могут заглядывать в environment процесса и могут таким образом узнать пароли.


Next Previous Contents