Надо отредактировать конфигурационные файлы (я рассчитываю, что у вас default конфиги apache) (NB: Apache/1.3.6 и выше по умолчанию конфигурируется только файлом httpd.conf. Директивы все остались прежние, просто их слили в один файл)
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
Прописать
<Files *.cgi>
SetHandler cgi-script
Options ExecCGI
</Files>
и apache буде исполнять файлы с расширением .cgi из любого каталога как CGI-скрипты.
Прежде чем читать дальше, убедитесь в том, что:
error_log для того и служит, чтобы туда смотреть :-)
Возникает, если сервер не может отдать вам содержимое по причине отсутствия полномочий.
Проверьте:
Возникает в случае внутренней ошибки.
Проверьте:
print "Content-Type: text/html\n";
print "<HTML>\n";
Надо писать:
print "Content-Type: text/html\n\n"; # Два "\n"
print "<HTML>\n";
Также, эта ошибка возникает, если CGI-программа завершилась с ненулевым кодом возврата, что часто встречается в случае некомпилируемости вашего скрипта perl'ом.
Совет: делайте
use CGI::Carp qw(fatalsToBrowser)
во время отладки, тогда вам выдадут сообщение об ошибке perl.
apache устанавливает переменную окружения REMOTE_HOST, если ему разрешено проводить dns запросы для определения имени. Для 1.3.x по-умолчанию это выключено. Включается/выключается директивой HostNameLookups, которая может принимать 3 значения: on -- проводить запросы, off -- не запрашивать dns и double -- делать двойные запросы: запрашивать имя хоста, а затем по имени запрашивать ip адрес, для безопасности.
Переменная окружения REMOTE_USER устанавливается apache в случае, если скрипт защищен паролем. Как это сделать рассказано на http://www.apacheweek.com/features/userauth и http://www.apacheweek.com/features/dbmauth
Прописать
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 процесса и могут таким образом узнать пароли.