![通过链接在浏览器中运行 perl 脚本](https://linux22.com/image/777673/%E9%80%9A%E8%BF%87%E9%93%BE%E6%8E%A5%E5%9C%A8%E6%B5%8F%E8%A7%88%E5%99%A8%E4%B8%AD%E8%BF%90%E8%A1%8C%20perl%20%E8%84%9A%E6%9C%AC.png)
我正在尝试在 Oracle Linux 8.5 上启动并运行 perl 脚本。
我的 Apache 服务器和虚拟主机使用静态 html 工作。
我的测试虚拟主机 fnu 在 /var/www/fnu 中有一个名为 hw.pl 的非常基本的 perl 脚本:
#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "Hello, World. This is fnu.";
index.html
我有一个从到 的链接hw.pl
,权限打开且所有者设置为apache
:
-rwxrwxrwx. 1 apache apache 89 Jun 4 20:59 hw.pl
lrwxrwxrwx. 1 apache apache 5 Jun 4 20:59 index.html -> hw.pl
以下是站点配置/etc/httpd/conf.d
:
<VirtualHost *:80>
DocumentRoot "/var/www/fnu/"
ServerName fnu.[obscured].net
ServerAlias fnu
ErrorLog /var/log/fnu/error.log
CustomLog /var/log/fnu/request.log combined
<\/VirtualHost>
<Directory "/var/www/fnu">
Options +ExecCGI +SymLinksIfOwnerMatch
AddHandler cgi-script .cgi .pl
<\/Directory>
如果我将浏览器指向fnu/hw.pl
,我会得到我期望的结果 - 脚本输出。如果我将浏览器指向fnu/
,我会得到文件的内容。因此,它会跟踪链接,但到达那里后不会将其作为 perl 脚本运行。 中没有任何有用的东西/var/log/fnu/error.log
。
SELinux 设置为 Permissive。
我非常感谢您的帮助。
答案1
它将 index.html 读取为 html 文件。
纠正此问题的一种方法是告诉 apache 将 .phtml 文件作为 perl 执行。
要做到这一点,你需要找到:
<IfModule dir_module>
DirectoryIndex index.html index.phtml index.php
</IfModule>
在您的 httpd 配置中并将 index.phtml 添加到DirectoryIndex
列表中,如上所示。
然后您需要AddHandler cgi-script .phtml
将您的链接重命名为index.phtml。
这应该可以工作,但是我已经很多年没有在 apache 中使用过 cgi 了。
另一种方法是使用星海 (服务器端包含)和mod_include. 你可以用这个创建一个 index.html 和<!--#include virtual="/path/to/hw.pl" -->
OR<!--#exec cmd="hw.pl" -->
我不记得哪个更好,但根据你的脚本的作用,你可以阅读文档并找出最佳方法。
答案2
谢谢,我找到了另一种资源,并能够使用SetHandler
配置而不是 来解决这个AddHandler
问题。我意识到在某些情况下这可能是一个过于宽泛的解决方案,但它在这里实现了我想要的效果。
<Directory "/var/www/fnu">
SetHandler cgi-script
Options +ExecCGI +SymLinksIfOwnerMatch
<\/Directory>
当我浏览到时,脚本现在运行fnu/
。