17

apache使用and进行配置时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/"
4

7 回答 7

31

当浏览器正在打印脚本代码时,这意味着它无法找到运行脚本的应用程序。下面两行应该是您解决此问题的第一步。AddHandler 将确保以 cgi 脚本结尾.cgi并被.pl视为 cgi 脚本的文件。并且+ExecCGI选项将允许执行脚本。还要确保您的脚本指向正确的 perl 二进制位置。

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

您的 httpd.conf 中还有一些错误/错误配置点

  • 别名行应该指向你的 cgi 脚本所在的cgi-bin目录。

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 脚本,如下所示。它应该首先从命令行打印或运行。

perl test.cgi

  • cgi-bin确保您对目录和 cgi 脚本具有读写递归权限。您还可以创建具有写入权限的目录或文件。cgi-bin如果不在其他地方创建目录,您可以在其中拥有写入权限,而是提供其路径aliasdirectory属性httpd.conf
  • 每次遇到 apache conf 问题时,请检查 apache 错误日志以获取确切的错误消息。它将使您对问题有很好的了解。

链接也应该对您有所帮助。

额外评论,不是原始回答者:您可能还需要启用该cgi模块。对我来说,让 cgi 在全新安装的 Apache 2 上工作的最后一步是sudo a2enmod cgi。在我这样做之前,网站只是向我展示了脚本的内容。)

sudo a2enmod cgi

于 2013-02-10T09:14:19.693 回答
2

更改新版本的 apache:选项 +FollowSymLinks +ExecCGI

于 2014-02-13T13:17:32.977 回答
2

目录/位置/文件没有与之关联的正确处理程序,或者没有ExecCGI启用该选项。请参阅Apache 教程:使用 CGI 的动态内容

于 2013-02-10T00:11:26.910 回答
1

在 Mac OS X 10.8 上

我不得不这样做

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

取消注释

#AddHandler cgi-script .cgi .pl
于 2013-10-12T07:25:06.863 回答
1
 # 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>
于 2014-08-21T19:05:18.073 回答
1

当浏览器正在打印脚本代码时,这意味着它无法找到运行脚本的应用程序。

使用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,具体取决于我使用的编程语言(并且 apache cgi-bin 目录包含一个没有扩展名的测试 cgi 脚本),它们都无需指定即可执行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​​ 中工作。)否则,您将再次收到内部服务器错误。

执行 cgi 脚本的 url:

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 文档说要使用该选项安装 apache,所以我继续这样做:

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

Apache DSO 文档在这里

于 2016-04-16T01:25:53.883 回答
0

如果没有其他工作,请确保您正在显示从本地服务器调用可执行脚本的 HTML 页面,例如http://192.168.0.15/yourPage.html。如果您通过在浏览器中将 HTML 页面作为文件打开来调用它,它将始终将您的可执行脚本显示为文件。

于 2020-08-08T17:38:34.613 回答