我在 Apache 服务器上有一个页面site.shtml
,我想在其中包含一些 CGI 脚本,如下所示:
<p><pre><!--#include virtual="files/testfile" --></pre></p>
<p><pre><!--#include virtual="cgi-bin/randhtml.cgi"--></pre></p>
<p><pre><!--#include virtual="cgi-bin/echo.cgi" --></pre></p>
<p><pre><!--#include virtual="echo.cgi" --></pre></p>
<p><pre><!--#include virtual="cgi-bin/echo.cgi?test" --></pre></p>
在这种情况下,files/testfile
是一个文本文件,cgi-bin/randhtml.cgi
是一个预安装的 CGI 可执行文件,并且的两个实例echo.cgi
都是脚本:
#!/bin/sh
echo $0;
echo $*;
所有脚本的权限都设置为 755,并且可以从 shell 执行,它们的行为符合预期(随机输出或回显参数)。
当我尝试加载网页时,文件和随机脚本可以正确执行,并且我得到了预期的输出。 echo 脚本却不行,页面中出现了许多错误:
This is a test text file.
random
An error occurred while loading this page.
An error occurred while loading this page.
An error occurred while loading this page.
错误日志仅包含:
unable to include "cgi-bin/echo.cgi" in parsed file /home1/user/public_html/site.shtml
unable to include "echo.cgi" in parsed file /home1/user/public_html/site.shtml
unable to include "cgi-bin/echo.cgi?test" in parsed file /home1/user/public_html/site.shtml
我测试了其他各种脚本,包括 shell 和 perl,分别名为 .cgi 和 .pl(Apache 设置为将两者都作为 CGI 脚本处理),似乎都出现了此错误。我仔细检查了权限,并尝试使用 777,但无济于事。我将虚拟路径写为 和cgi-bin/
,/cgi-bin/
但都不起作用。
我是否遇到了一些限制、语法错误或一些奇怪的服务器问题?
答案1
您可能需要向 CGI 输出添加 Content-type 标头。
你确定你的 Apache 错误日志中没有出现其他内容吗?(你是在 grep 它们,还是在不经过筛选的情况下查看它们?)当我尝试重现你的问题时,我看到如下几行:
[Sun Dec 11 07:27:47 2011] [error] [client 192.0.2.1] unable to include "cgi-bin/echo.cgi" in parsed file /var/data/www/www.example.org/ssi-test.shtml
...但它们伴随着:
[Sun Dec 11 07:31:39 2011] [error] [client 192.0.2.1] malformed header from script. Bad header=/var/data/www/www.example.org: echo.cgi
我怀疑如果你添加:
echo "Content-type: text/html"
echo ""
... 到脚本的顶部,在出现任何其他输出之前,您的问题将会消失...或者至少其中的这一部分将会消失。:-)