在 Apache 下使用 Perl 运行 CGI 权限问题

在 Apache 下使用 Perl 运行 CGI 权限问题

apache2.conf我的 Debian 框中有以下条目。

AddHandler cgi-script .cgi .pl
Options +ExecCGI
ScriptAlias /cgi-bin/ /var/www/mychosendir/cgi-bin/

<Directory /var/www/mychosendir/cgi-bin>
Options +ExecCGI -Indexes
allow from all
</Directory>

然后我有一个 perl cgi 脚本存储在这些目录和权限下:

nvs@somename:/var/www/mychosendir$ ls -lhR 
.:
total 12K
drwxr-xr-x 2 nvs nvs 4.0K 2010-04-21 13:42 cgi-bin

./cgi-bin:
total 4.0K
-rwxr-xr-x 1 nvs nvs 90 2010-04-21 13:40 test.cgi

但是当我尝试在网络浏览器中访问它时:

http://myhost.com/mychosendir/cgi-bin/test.cgi

他们给了我这个错误:

[Wed Apr 21 15:26:09 2010] [error] [client 150.82.219.158] (8)Exec format error: exec of '/var/www/mychosendir/cgi-bin/test.cgi' failed
[Wed Apr 21 15:26:09 2010] [error] [client 150.82.219.158] Premature end of script headers: test.cgi

它出什么问题了?

更新

我的中也有以下条目apache2.conf

<Files ~ "^\.ht">
    Order allow,deny
    Deny from all
</Files>

其内容test.cgi如下:

#!/usr/bin/perl -wT
print "Content-type: text/html\n\n";
print "Hello, world!\n";

答案1

确保 cgi-bin 目录有一个 <Directory> 部分。并确保其中包含“allow from all”。

<Directory /var/www/mychosendir/cgi-bin>
    Options +ExecCGI -Indexes
    allow from all
</Directory>

另外...您的 ScriptAlias 是 /cgi-bin/。您的 URL 是 /mychosendir/cgi-bin。除非您使用了一些重写魔法,否则您的 URL 应该是http://my.host.com/cgi-bin/test.cgi,或者你需要将 ScriptAlias 行更改为如下形式

ScriptAlias /mychosendir/cgi-bin/ /var/www/mychosendir/cgi-bin

您在更新中发布的错误听起来像是您的脚本开头没有 #! 行。您需要一个,它应该看起来像

#!/path/to/your/perl

答案2

您确定 Apache 用户/组对给定文件具有读取和执行权限吗?通常此用户称为 httpd 或 www-data。

答案3

“脚本标头过早结束”意味着 CGI 脚本没有打印出正确的 HTTP 标头。它至少需要打印出

内容类型:text/html;

另外,您还有

ScriptAlias /cgi-bin/ /var/www/mychosendir/cgi-bin/

但你却要求

http://myhost.com/mychosendir/cgi-bin/test.cgi

那应该是

http://myhost.com/cgi-bin/test.cgi

或者说

ScriptAlias /mychosendir/cgi-bin/ /var/www/mychosendir/cgi-bin/

相关内容