如何让 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
不仅如此,如果您输入了错误的内容,它会立即通知您。