Страница 10 из 16
5. Web серверы 5.1 Как заставить WWW сервер исполнять CGI-программы? Apache для Unix/Win32 Надо отредактировать конфигурационные файлы (я рассчитываю, что у вас default конфиги apache) (NB: Apache/1.3.6 и выше по умолчанию конфигурируется только файлом httpsd.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 https://you/cgi-bin/program_name Способ 2 Добавить в srm.conf директиву AddHandler cgi-script .cgi и вы сможете вызывать cgi-программу из любого каталога. Но она должна иметь окончание .cgi и для нее должно быть разрешено исполнение CGI (Options ExecCGI в access.conf, написано выше). Оба способа можно без проблем использовать совместно. 5.2 Мой CGI-скрипт не работает! Как установить причину? Прежде чем читать дальше, убедитесь в том, что: - Вы запустили скрипт с командной строки (не через CGI!!!) и он работает, а не говорит "compilation stopped due to errors"
- Скрипт не только работает, но и выдает нужный заголовок с пустой строкой после него
- Для многопользовательских систем) Вы сделали тоже под пользователем, под которым работает сервер (su -m имя_пользователя -c script в Unix) и он столь же благополучно работает
5.3 Ошибки HTTP 500 и 403. Что это значит и что с ними делать error_log для того и служит, чтобы туда смотреть :-) Ошибка 403 "Forbidden" Возникает, если сервер не может отдать вам содержимое по причине отсутствия полномочий. Проверьте: - Может ли user (для apache под Unix это обычно nobody), под которым работает, сервер исполнять файл?
- В частности, может ли сервер исполнять интерпретатор (в случае скриптовых языков)?
- Можно ли для этого каталога исполнять программы CGI? (Options ExecCGI для apache)
Ошибка 500 "Internal Server Error" Возникает в случае внутренней ошибки. Проверьте: - Выводите ли вы строку "Content-Type:"?
- Правильно ли вы ее выводите? (Content-type, Content_Type -- неправильно)
- Заканчиваете ли вы хедеры пустой строкой? Нельзя написать 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. 5.4 Почему $ENV{REMOTE_HOST} пуста? apache устанавливает переменную окружения REMOTE_HOST, если ему разрешено проводить dns запросы для определения имени. Для 1.3.x по-умолчанию это выключено. Включается/выключается директивой HostNameLookups, которая может принимать 3 значения: on -- проводить запросы, off -- не запрашивать dns и double -- делать двойные запросы: запрашивать имя хоста, а затем по имени запрашивать ip адрес, для безопасности. 5.5 Почему $ENV{REMOTE_USER} пуста? Переменная окружения REMOTE_USER устанавливается apache в случае, если скрипт защищен паролем. Как это сделать рассказано на https://www.apacheweek.com/features/userauth и https://www.apacheweek.com/features/dbmauth |