从SHTML执行perl只包含脚本,而不是eexecuted

时间:2014-01-24 11:33:49

标签: perl .htaccess shtml

我在运行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

1 个答案:

答案 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" -->

根据Apache manual

  

使用#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