0

我对 CGI 和 Apache 完全陌生,但我正在尝试一些事情。首先,我用 C 编写了一个简单的 hello CGI。

#include <stdio.h>

void main() {
    printf("Content-type: text/html\n\n");
    printf("<html>\n");
    printf("<head><title>CGI Output</title></head>\n");
    printf("<body>\n");
    printf("<h1>Hello, world.</h1>\n") ;
    printf("</body>\n");
    printf("</html>\n"); 
}

编译它gcc hello.c -o hello.cgi并把它放在 /var/www/mycgi

之后我修改了 httpd.conf 以添加以下内容

ScriptAlias /mycgi/ "/var/www/mycgi/"

在 IfModule alias_module 和

<Directory "/var/www/mycgi">
    Options +ExecCGI
    AddHandler cgi-script .cgi
    AllowOverride None
    Options None
    Order allow,deny
    Allow from all
</Directory>

然后我重新启动了 Apache,当我转到 localhost/mycgi/hello.cgi 时,浏览器只是下载文件而不是运行它。帮助将不胜感激!

4

2 回答 2

3

根据janos的建议,您应该确保 apache2 已加载 cgi_module: LoadModule cgi_module modules/mod_cgi.so。您可以通过以下方式做到这一点:

sudo ln -s /etc/apache2/mods-available/cgi.load /etc/apache2/mods-enabled/cgi.load

然后重新启动apache2,这次它会加载cgi.load文件。

于 2014-03-17T11:14:17.630 回答
0

即使这是一个老问题,我想很多其他人也会遇到同样的问题......首先我们必须告诉 Apache 他必须“执行”什么样的文件以及这些文件在哪里:

编辑etc/apache2/apache2.conf(例如使用 nano)

添加

<Directory "/home/johnny/public_html">
    Options +ExecCGI
    AddHandler cgi-script .cgi
</Directory>

在这种情况下,Apache 将尝试执行位于用户“johnny”的 public_html 中的所有以 .cgi 结尾的文件。例如,您可以添加多个扩展名:

AddHandler cgi-script .cgi .pif .gloup

等等。

编译: cd 到 .c 源所在的文件夹,然后:

gcc 你好.c

这将给出一个名为“a”的文件(或者可能是 a.out,它取决于操作系统)。要更改结果的名称:

gcc hello.c -o ../public_html/my_cgi.gloup

如果 .gloup 已经添加了 AddHandler 和你想通过网络访问的 exec 文件。

在许多情况下,这会出错。你可以试试改权限,exec之类的,没用。问题出在很多情况下,我们以“root”身份运行 gcc,因此结果所有者是 root。当我们尝试从网络上执行它时,我们不是“root”。

解决方法是更换用户。例如,如果您的 public_html 文件夹所有者是“johnny”,那么当您以 root 身份登录时,只需执行以下操作:

苏-约翰尼

现在你“是”约翰尼。只需 cd 到带有你的 c 文件的文件夹,使用 gcc 编译,你就可以从网络上执行。

于 2021-03-30T17:26:39.487 回答