Подтвердить что ты не робот

Perl Apache: Perl script отображается как обычный текст

При настройке с помощью apache и perl cgi scripts не знаете, почему index.cgi/index.pl отображаются как обычный текст вместо их выполнения. Когда я помещаю http://localhost в браузер, он отображает ниже код, а не выполняет его.

List item
    #!C:/Dwimperl/perl/bin/perl.exe -w

     print "Content-type: text/html\n\n";
        print <<HTML;
        <html>
        <head>
        <title>A perl web page</title>
        </head>
        <body>
        <h3>A hello world form perl</h3>
        </body>

        HTML
        exit;

Это части файла httpd.conf, который я редактировал большую часть времени (после чтения различных онлайн-ссылок, руководств)

# This should be changed to whatever you set DocumentRoot to.
<Directory "D:\webserver">

Listen 80
ServerName localhost:80
LoadModule cgi_module modules/mod_cgi.so

# First, we configure the "default" to be a very restrictive set of 
# features.  
<Directory />
    Options FollowSymLinks +ExecCGI
    AllowOverride None
</Directory>

DirectoryIndex index.html index.html.var index.cgi index.pl

AccessFileName .htaccess

# To use CGI scripts outside of ScriptAliased directories:
# (You will also need to add "ExecCGI" to the "Options" directive.)
#
#AddHandler cgi-script .cgi .pl

ScriptAlias /cgi-bin/ "C:/Apache/Apache2/cgi-bin/"
4b9b3361

Ответ 1

Когда браузер печатает код script, это означает, что он не может найти приложение для запуска script. Ниже двух строк должны быть ваши первые шаги для решения этой проблемы. AddHandler гарантирует, что файлы, заканчивающиеся на .cgi и .pl, будут обрабатываться как cgi-скрипты. Опция +ExecCGI позволяет выполнить script. Также убедитесь, что ваш script указывает на правильное двоичное местоположение perl.

    AddHandler cgi-script .cgi .pl
    Options FollowSymLinks +ExecCGI

Также есть некоторые ошибки/неправильные точки в вашем httpd.conf

  • Строка псевдонима должна указывать на каталог cgi-bin, где присутствуют ваши скрипты cgi.

ScriptAlias ​​/cgi-bin/ "D:\webserver\cgi-bin"

  • Для того же каталога cgi-bin следующая конфигурация должна быть в httpd.conf. Вы должны заменить часть <Directory "D:\webserver"> ниже.
<Directory "D:\webserver\cgi-bin" />
    AddHandler cgi-script .cgi .pl
    Options FollowSymLinks +ExecCGI
    AllowOverride None  
</Directory>
  • Попробуйте запустить cgi script из командной строки, как показано ниже. Он должен сначала печатать или запускать из командной строки.

perl test.cgi

  • Убедитесь, что у вас есть рекурсивные разрешения на чтение и запись в каталог cgi-bin и ваш cgi script. А также вы можете создать каталог или файл с разрешениями на запись. Если не создать каталог cgi-bin в другом месте, где вы можете иметь права на запись, и вместо этого укажите его путь в атрибутах alias и directory в httpd.conf.
  • Проверяйте журнал ошибок apache для получения точного сообщения об ошибке при каждом запуске проблем с apache conf. Это даст вам хорошее представление о проблеме.

Также эта ссылка должна помочь вам.

(Дополнительный комментарий, а не исходный ответчик: вам также может понадобиться включить модуль cgi. Для меня последним шагом к тому, чтобы cgi работал над новой установкой Apache 2, был sudo a2enmod cgi. сделал это, сайт просто показал мне содержимое script.)

sudo a2enmod cgi

Ответ 3

изменить новую версию apache: Опции + FollowSymLinks + ExecCGI

Ответ 4

на mac os x 10.8

Мне пришлось это сделать

<Directory />
    Options FollowSymLinks +ExecCGI
    AllowOverride None
</Directory>

и

раскомментируйте это

#AddHandler cgi-script .cgi .pl

Ответ 5

 # use types www.site.com/visible-in-url
 # Apache serves /var/path/to/dir
 ScriptAlias /visible-in-url/ /var/path/to/dir/

 # Note the order of the aliases matters - first cgi than static content
 # Note this dir is a symlink pointing to the desirable directory
 <Directory "/var/path/to/dir">
    AddHandler cgi-script .cgi .pl
    AllowOverride Indexes
    Options +ExecCGI +MultiViews +SymLinksIfOwnerMatch
    Require all granted
 </Directory>

 <Files ~ "\.(pl|cgi)$">
    SetHandler perl-script
    PerlResponseHandler ModPerl::PerlRun
    Options +ExecCGI +SymLinksIfOwnerMatch
    PerlSendHeader On
 </Files>

Ответ 6

Когда браузер печатает код script, что означает, что он не может найти приложение для запуска script.

С Apache 2.4 (в OSX Yosemite, 10.10.5), если я использую строку shebang с неправильным путем, в моем браузере отображается:

Внутренняя ошибка сервера

Но даже с допустимой строкой shebang я не мог заставить свою программу cgi выполнять, следуя рекомендациям в принятом ответе - Apache просто подал текст программы в мой браузер. После некоторых экспериментов я обнаружил, что единственным изменением, которое мне нужно было внести в мой файл /usr/local/apache2/conf/httpd.conf, была раскомментация строки:

LoadModule cgid_module modules/mod_cgid.so

Мои программы CGI имеют расширение .pl,.py и .rb в зависимости от того, какой язык программирования я в (а апач CGI-BIN директория содержит тестовый CGI script без расширения), и все они выполняться без указания допустимых расширений в любом месте файла httpd.conf. Мой файл httpd.conf по умолчанию имеет только следующие строки:

<IfModule alias_module>
    #Lots of comments here

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

</IfModule>
...
...
<Directory "/usr/local/apache2/cgi-bin">
    AllowOverride None
    Options None
    Require all granted
</Directory>

Линия shebang, которую я использую, зависит от того, на каком языке написана моя программа cgi:

#!/usr/bin/env perl

или:

#!/usr/bin/env python 

или:

#!/usr/bin/env ruby

Программа cgi также должна быть исполняемым файлом, иначе вы получите ошибку Внутренний сервер:

$ chmod a+x myprog.pl

a+x = > все + исполняемый файл. Другими словами, добавьте права на выполнение для каждого из владельцев, группы и других.

И, как минимум, программа cgi должна сгенерировать Content-Type header перед выдачей тела ответа:

print "Content-Type: text/html\n\n";
print "<h1>Hello, World.</h1>";

(Кстати, этот точный код будет работать в perl, python или ruby.) В противном случае вы снова получите ошибку Внутренний сервер.

URL-адрес для выполнения cgi script:

http://localhost:8080/cgi-bin/myprog.pl

Вот как я установил apache:

~/Downloads$ tar xvfz httpd-2.4.18.tar.bz2
...
...
~/Downloads$ cd httpd-2.4.18
...
...
~/Downloads/httpd-2.4.18$ ./configure --help
...
...
--enable-so       DSO capability. This module will be automatically
                  enabled unless you build all modules statically.
...
...

Я понятия не имел, что, черт возьми, что имел в виду, но PHP документы говорят, чтобы установить апача с этой опцией, поэтому я пошел вперед и сделал это:

~/Downloads/httpd-2.4.18$ ./configure --enable-so
...
...
~/Downloads/httpd-2.4.18$ make
...
...
~/Downloads/httpd-2.4.18$ sudo make install

Apache DSO docs здесь.