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

Posted

技术标签:

【中文标题】Perl Apache:Perl 脚本显示为纯文本【英文标题】:Perl Apache : Perl script displayed as plain text 【发布时间】:2013-01-25 10:09:56 【问题描述】:

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

【问题讨论】:

投反对票没关系,但如果你知道答案,请告诉我。我很难配置 httpd.conf 文件。 您的 Perl 是否安装正确。如果没有找到您的脚本指定的 perl,Apache 通常会打印文件内容。 http配置很头疼。我同意。 【参考方案1】:

当浏览器正在打印脚本代码时,这意味着它无法找到运行脚本的应用程序。下面两行应该是您解决此问题的第一步。 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。您应该将 &lt;Directory "D:\webserver"&gt; 部分替换为以下内容。
<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 错误日志以获取准确的错误消息。它将让您深入了解问题。

另外this link 应该可以帮助你。

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

sudo a2enmod cgi

【讨论】:

非常感谢。您给定的链接使 httpd.conf 文件配置变得简单易懂。我删除了旧的 httpd.conf(经过大量编辑),从 httpd-default 文件创建了新的 httpd.conf 文件。按照homepages.paradise.net.nz/milhous/cgi.htm 的指导编辑了新制作的httpd.conf 文件并更改了CGI 脚本,并且成功了。再次感谢您的帮助,因为上面的链接不仅解决了这个问题,还提供了关于发布、获取、数据库等的信息。 sudo a2enmod cgi 为我解决了问题,如果重要的话,使用 Raspberry Pi。 感谢您的额外评论...对我来说,a2enmod cgi 是必需的。【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

在 mac os x 10.8 上

我必须这样做

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

取消注释

#AddHandler cgi-script .cgi .pl

【讨论】:

在 10.10 优胜美地,我还需要做 LoadModule cgi_module modules/mod_cgi.so 然后 sudo apachectl restart。对于我的选项声明,我必须这样做:Options +FollowSymLinks +ExecCGI,因为有人抱怨只使用一个 + 号...【参考方案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>

【讨论】:

部分修复了新 Apache 2.4 中的问题。我觉得他们走的是老派的微软路线,并通过该更新打破了几乎所有内容。当然,它更好,更安全,好的方向。但是哇,真是一场灾难。【参考方案6】:

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

使用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 程序也必须是可执行文件,否则您将收到 Internal Server 错误:

$ chmod a+x myprog.pl

a+x => 全部 + 可执行文件。也就是说,给owner、group、other中的每一个添加可执行权限。

而且,cgi 程序至少必须在输出响应正文之前生成一个Content-Type header

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

(顺便说一句,确切的代码可以在 perl、python 或 ruby​​ 中运行。)否则,您将再次收到 Internal Server 错误。

执行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 docs 说要使用该选项安装 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 文档here。

【讨论】:

【参考方案7】:

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

【讨论】:

以上是关于Perl Apache:Perl 脚本显示为纯文本的主要内容,如果未能解决你的问题,请参考以下文章

如何检查一个文件的值是不是包含在另一个文本文件中? (perl 脚本)

使用 MIME::Entity 将 HTML 电子邮件转换为纯文本

Perl Apache 脚本按预期从 browser-perfroms 运行关闭正在运行的 perl 实例,但是当尝试启动新的 perl 实例时它啥也不做

Apache 从 Perl CGI 脚本的脚本返回格式错误的标头

Apache 未在包含的 perl 脚本中执行“do”包含函数

《每日一题》第81题Perl脚本处理:利用perl对文本进行处理