我在运行Apache 2.2.25的托管linux Web服务器上。以下shtml只显示perl脚本的内容而不是执行脚本。我知道脚本从ssh运行(我无法访问ssh)。我确定我在.htaccess文件中遗漏了一些东西。我们将非常感激地提供任何帮助。
SHTML
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Perl</title>
</head>
<body>
<!--#exec cgi="cgi-bin/test.pl"-->
</body>
</html>
perl(test.pl)
#!/usr/bin/perl
print "HELLO FROM PERL";
的.htaccess
AddHandler cgi-bin .pl .cgi
AddType text/html .shtml .php
AddOutputFilter INCLUDES .shtml .php
Options +Includes
答案 0 :(得分:0)
ExecCGI
我猜你的cgi-bin
目录不是ScriptAlias
,在这种情况下,除了设置处理程序外,还需要使用ExecCGI
选项:
AddHandler cgi-script .cgi .pl
Options +ExecCGI
还要确保Apache具有脚本的执行权限。有关详细信息,请参阅Configuring Apache to permit CGI。
#include virtual
此外,您应该使用SSI命令#include virtual
而不是#exec cgi
:
<!--#include virtual="/cgi-bin/test.pl" -->
使用
#include virtual
几乎总是优先使用#exec cgi
或#exec cmd
。前者(#include virtual
)使用标准的Apache子请求机制来包含文件或脚本。它的测试和维护要好得多。
更糟糕的是,#exec
可用于在您的Web服务器上运行任意代码。实际上最好完全禁用它:
Options +IncludesNOEXEC
#include
还允许您通过查询字符串将参数传递给CGI,例如
<!--#include virtual="/cgi-bin/test.pl?arg1=foo&arg2=bar" -->
您无法使用#exec
。
请注意,传递给#include virtual
的参数是相对于当前文档的URL,不是文件路径。
如果您还没有,我建议您阅读Apache的Introduction to Server Side Includes。
XBitHack
最后,我更喜欢使用XBitHack
指令,而不是要求SSI文件具有特殊的文件扩展名(.shtml
):
XBitHack on
将解析具有用户执行位设置的任何text/html
文件以进行SSI。这意味着当您想要向其添加SSI时,您不必重命名文件(可能会破坏链接或用户的书签)。
总而言之,我会像这样设置.htaccess
:
AddHandler cgi-script .cgi .pl
Options +ExecCGI +IncludesNOEXEC
XBitHack on