0

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

1 回答 1

0

ExecCGI

我猜你的cgi-bin目录不是'ed,在这种情况下,除了设置处理程序之外,ScriptAlias你还需要使用该选项:ExecCGI

AddHandler cgi-script .cgi .pl
Options +ExecCGI

还要确保 Apache 对您的脚本具有执行权限。有关详细信息,请参阅配置 Apache 以允许 CGI

#include virtual

此外,您应该使用 SSI 命令#include virtual而不是#exec cgi

<!--#include virtual="/cgi-bin/test.pl" -->

根据Apache 手册

使用#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 的服务器端包含简介。

XBitHack

.shtml最后,我更喜欢使用以下XBitHack指令,而不是要求 SSI 文件具有特殊的文件扩展名 ( ):

XBitHack on

任何text/html设置了用户执行位的文件都将被解析为 SSI。这意味着当您想将 SSI 添加到文件时,您不必重命名文件(可能会破坏链接或用户的书签)。

把它们放在一起,我会这样设置.htaccess

AddHandler cgi-script .cgi .pl
Options +ExecCGI +IncludesNOEXEC
XBitHack on
于 2014-01-24T19:08:14.527 回答