Perl Apache:Perl脚本显示为纯文本

时间:2013-02-09 23:49:39

标签: perl apache windows-7 configuration cgi

使用apacheperl 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/"

7 个答案:

答案 0 :(得分:28)

当浏览器打印脚本代码时,意味着它无法找到运行该脚本的应用程序。下面两行应该是解决这个问题的第一步。 AddHandler将确保以.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目录,而是在alias中的directoryhttpd.conf属性中提供其路径。
  • 每次遇到apache conf问题时,请检查apache错误日志以获取确切的错误消息。它会让你很好地了解这个问题。

同样this link可以帮到你。

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

  

sudo a2enmod cgi

答案 1 :(得分:2)

目录/位置/文件没有与之关联的正确处理程序,或者没有启用ExecCGI选项。请参阅Apache Tutorial: Dynamic Content with CGI

答案 2 :(得分:2)

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

答案 3 :(得分:1)

在mac os x 10.8

我必须这样做

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

取消注释

#AddHandler cgi-script .cgi .pl

答案 4 :(得分: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>

答案 5 :(得分:1)

  

当浏览器打印脚本代码时,表示无法找到   运行脚本的应用程序。

使用x := math.Add(6 + 5) (在OSX Yosemite,10.10.5),如果我使用错误路径的shebang行,我的浏览器会显示:

  

内部服务器错误

但即使有一个有效的shebang系列,我也无法通过遵循接受的答案中的建议来执行我的cgi程序--Apache只是将程序文本提供给我的浏览器。经过一些实验,我发现我需要对x := math.Add(6, 5) 文件进行的唯一更改是取消注释该行:

Apache 2.4

我的cgi程序有扩展名.pl,.py和.rb,具体取决于我编程的语言(而apache cgi-bin目录包含一个没有扩展名的测试cgi脚本),所有这些都是无需在httpd.conf文件中的任何位置指定有效扩展即可执行。我的默认/usr/local/apache2/conf/httpd.conf文件只包含以下相关行:

LoadModule cgid_module modules/mod_cgid.so

我使用的shebang系列,取决于我的cgi程序所使用的语言:

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>

或:

#!/usr/bin/env perl

cgi程序也必须是可执行文件,否则您将收到内部服务器错误:

#!/usr/bin/env python 

#!/usr/bin/env ruby =&gt;全部+可执行。换句话说,将可执行权限添加到所有者,组,其他。

并且,在输出响应正文之前,cgi程序必须至少生成$ chmod a+x myprog.pl

a+x

(顺便说一句,确切的代码将在perl,python或ruby中运行。)否则,您将再次遇到内部服务器错误。

执行cgi脚本的URL:

Content-Type header

这就是我安装apache的方式:

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

我不知道这意味着什么,但php docs说要用这个选项安装apache,所以我继续这样做:

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

Apache DSO docs here

答案 6 :(得分:0)

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