2017-04-27 220 views
0

編輯:這個問題已被錯誤地標記爲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

回答

0

只需添加ScriptAlias指令,如果你沒有指令內非動態內容: