在 apache2 上运行二进制 cgi

在 apache2 上运行二进制 cgi

如何让 apache2 将二进制文件作为 cgi 运行。我有一个测试页面,当我访问它时,它返回错误代码 500 内部服务器错误,并且有一个

  "End of script output before headers" 

中的錯誤/var/log/apache2/error.log

这不是一个脚本,它是一个 elf 可执行文件。

答案1

根据Apache 文档

首先,CGI 程序的所有输出都必须以 MIME 类型标头开头。这是 HTTP 标头,用于告诉客户端正在接收什么类型的内容。大多数情况下,它看起来像:

内容类型:text/html

其次,输出内容必须是 HTML 格式,或者浏览器能够显示的其他格式。大多数情况下,输出内容是 HTML,但有时,您可能需要编写一个 CGI 程序来输出 gif 图像或其他非 HTML 内容。

我猜测你的程序(elf 可执行文件)没有在内容之前打印出 http 标头。


更新

为了在您的主目录中执行 CGI 程序,/var/www您应该添加:

<Directory /var/www>
    Options +ExecCGI
    AddHandler cgi-script .bin
</Directory>

WhereAddHandler指令允许 CGI 程序对目录.bin中所有以 为扩展名的文件执行。/var/www

另一种可能性是创建cgi-bin目录并将可执行文件放入其中。

在这种情况下,在您的 Apache 配置文件中添加:

<Directory /var/www/mycgi-bin>
    Options ExecCGI
    SetHandler cgi-script
</Directory>

答案2

在 Ubuntu 20.04 上,我遇到了一个问题,我认为我还没有 100% 解决它。我就是无法解释它。起初我有这样的ScriptAlias定义:

ScriptAlias /cgi-bin/ /var/www/project/cgi-bin/

经过大约 4 小时的研究,我发现cgi-bin别名路径不知何故发生冲突对于二进制可执行文件(.ELF 文件)。奇怪的是,它与 shell 脚本配合得很好,但与二进制文件配合不好... 所以我最终尝试了:

ScriptAlias /cgi/ /var/www/project/cgi-bin/

并且成功了!!!对我的设置的任何其他更改均对结果没有影响(即一切都已正确设置)。

我的定义在<VirtualHost ...>定义之下,所以应该没有冲突。但冲突肯定是有的。


边注

每次更改设置后,请确保重新启动,以确保设置有效并且您正在测试预期的内容:

$ sudo systemctl restart apache2

不仅如此,如果您输入了错误的内容,它会立即通知您。

相关内容