不能让Apache执行perl CGI脚本

问题描述:

编辑:这个问题已被错误地标记为How can I troubleshoot my Perl CGI script?的副本,该问题涉及如何调试Perl程序和答案解释如何做到这一点。在这种情况下,我甚至没有达到那样的程度,问题原来是apache配置问题,我在Directory指令中使用了相对路径,这些问题在这个问题的答案中没有提及。不能让Apache执行perl CGI脚本

原问题: 我已经建立了一个Ubuntu的测试服务器(16.04.2 LTS),并试图获得apache来执行perl cgi脚本。它从命令行运行良好,但在浏览器中始终显示源代码。我在本网站和其他网站上浏览过很多页面的建议,但是我无法完成它,所以我们将不胜感激。

我的网站的conf文件看起来像这样(我希望能在每个目录基础上执行脚本):

<VirtualHost *:443> 
    DocumentRoot "/var/www/test" 
    ServerName mydomain.org 
    <Directory "/var/www/test"> 
      allow from all 
      Options None 
      Require all granted 
    </Directory> 

    SSLEngine on 
    SSLCertificateFile /etc/webmin/letsencrypt-cert.pem 
    SSLCertificateKeyFile /etc/webmin/letsencrypt-key.pem 
    SSLCACertificateFile /etc/webmin/letsencrypt-ca.pem 

    <Directory "path/to/dir"> 
      Options ExecCGI Indexes 
      AddHandler cgi-script .pl 
    </Directory> 
</VirtualHost> 

我启用的mods目录如下:

access_compat.load autoindex.conf mime.conf   setenvif.load 
alias.conf   autoindex.load mime.load   socache_shmcb.load 
alias.load   cgi.load  mpm_prefork.conf ssl.conf 
auth_basic.load  deflate.conf mpm_prefork.load ssl.load 
authn_core.load  deflate.load negotiation.conf status.conf 
authn_file.load  dir.conf  negotiation.load status.load 
authz_core.load  dir.load  php7.0.conf 
authz_host.load  env.load  php7.0.load 
authz_user.load  filter.load  setenvif.conf 

在error.log中没有错误,访问日志告诉我:

mydomain.org:443 xx.xxx.xxx.xx - - [27/Apr/2017:10:37:02 +0100] "GET /path/to/dir/test.pl HTTP/1.1" 304 3921 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36" 

脚本(test.pl)是sim从命令行工作:

#!/usr/bin/perl 

print "Content-type: text/html\n\n"; 

print "Hello, world!\n"; 

任何人都可以告诉我我在做什么错吗?

+0

第一件事,我看到:'“路径/到/目录”'应该是一个绝对路径:' “/ path/to/dir”'不应该吗?另外,你的'.pl'脚本是否可以执行正确的'#!'行? – cbmckay

+0

您的明星!让这个绝对路径奏效!只是为了澄清,是否有指定相对于DocumentRoot的路径的方法? – Kees

+0

我觉得'位置:'是你想要的。你也可以使用'.htaccess'文件。它们适用于它们所在的目录。并且/或者你可以使用'Files'指令来使用文件扩展名来执行。 – cbmckay

只需添加ScriptAlias指令,如果你没有指令内非动态内容: