Perl Apache:Perl 脚本显示为纯文本
Posted
技术标签:
【中文标题】Perl Apache:Perl 脚本显示为纯文本【英文标题】:Perl Apache : Perl script displayed as plain text 【发布时间】:2013-01-25 10:09:56 【问题描述】:在使用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/"
【问题讨论】:
投反对票没关系,但如果你知道答案,请告诉我。我很难配置 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 目录。对于相同的 cgi-bin 目录,以下配置应位于ScriptAlias /cgi-bin/ "D:\webserver\cgi-bin"
httpd.conf
。您应该将 <Directory "D:\webserver">
部分替换为以下内容。
尝试从命令行运行您的 cgi 脚本,如下所示。它应该首先从命令行打印或运行。<Directory "D:\webserver\cgi-bin" /> AddHandler cgi-script .cgi .pl Options FollowSymLinks +ExecCGI AllowOverride None </Directory>
确保您对perl test.cgi
cgi-bin
目录和您的cgi 脚本具有读写递归权限。您还可以创建具有写入权限的目录或文件。如果不在您可以拥有写入权限的其他位置创建cgi-bin
目录,而是在alias
和directory
属性中提供其路径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
(在 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 脚本的脚本返回格式错误的标头