C语言CGI和Apache服务器的开发环境

首先是需要的工具。我是在linux平台下安装的apache服务器,并使用的gcc编译器。当然你也可以在windows下安装使用,用IDE(如VC2008等)编译器。

安装apache服务器。下载好安装程序,在linux下是解压(tar -zxvf 压缩文件)后,cd到解压后的文件夹中,然后执行以下命令

sudo ./configure -prefix=/var/httpd/*选择安装路径*/
sudo make
sudo make install
一定不要忘记sudo,因为可能权限不够,造成安装失败。然后执行
sudo /var/httpd/bin/httpd -k start
启动apache服务器,如果下边的提示
httpd: Could not reliably determine the server's fully qualified domain name, using ::1 for ServerName
不用着急。到安装目录下找 conf文件夹下的httpd.conf文件,添加如下一行
ServerName 127.0.0.1:80/*注意读写权限*/
配置apache服务器

ScriptAlias /cgi-bin/ "/var/httpd/cgi-bin/"  /*此处引号中的路径为你所要准备存放cgi程序的目录*/
<Directory "/var/httpd/cgi-bin">
    AllowOverride None
    Options ExecCGI
    Order allow,deny
    Allow from all
</Directory>
AddHandler cgi-script .exe .pl .cgi
然后需要关闭服务器并重新开启
sudo /var/httpd/bin/httpd -k stop
sudo /var/httpd/bin/httpd -k start
好了,配置好了,可以在你的浏览器中输入地址127.0.0.1试试,看有什么回应!

编写简单cgi程序并测试

include <stdio.h>

int main(void)
{
        printf("Content-Type: text/html \n\n");
        printf("<html><p>HELLO WORLD!</p><a href='http://www.baidu.com'>BAIDU</a></html>");
        return 0;
}
gcc编译成可执行文件后,将可执行文件重命名成index.cgi。然后将cgi程序移到我们刚配置好的准备存放我们cgi程序的目录(/var/httpd/cgi-bin/)下,最后在浏览器地址栏输入

http://127.0.0.1/cgi-bin/index.cgi

大功告成!随意发挥自己想象改造世界吧!


<br>我在改造APACHE服务器授权访问时,需要对不合法的客户端请求进行过滤。对不合法请求需要立即发送一个错误提示页面给客户端。<br>发送错误提示页面的程序片断如下:<br> //非法请求作错误跳转<br> char *location = "/error/error.jsp";<br> r->status = HTTP_OK;<br> r->method = apr_pstrdup(r->pool, "GET");<br> r->method_number = M_GET;<br> ap_internal_redirect_handler(location, r);<br> //杀死子请求<br> ap_update_child_status(r->connection->sbh, SERVER_IDLE_KILL, r);<br>后来发现这样写有问题,以上代码对于没有启用mod_proxy的HTTP或HTTPS请求都是可以正确处理的。但是如果启用了mod_proxy功能后,就不会正确执行了。<br><br>于是我做了如下修改:<br> apr_table_setn(r->headers_out, "Http", "302");<br> //我们设置这个错误跳转到http://www.yahoo.com。<br> apr_table_setn(r->headers_out, "Location", "http://www.yahoo.com");<br> r->status = HTTP_TEMPORARY_REDIRECT; <br> //ap_send_error_response函数第二个参数设置为NULL(既0)<br> ap_send_error_response(r, 0); <br> //处理掉子请求<br> ap_update_child_status(r->connection->sbh, SERVER_IDLE_KILL, r);<br>就可以正确跳转了。<br>ap_send_error_response()在http_protocol.h定义为:<br>/**<br> * Send error back to client.<br> * @param r The current request<br> * @param recursive_error last arg indicates error status in case we get <br> * an error in the process of trying to deal with an ErrorDocument <br> * to handle some other error. In that case, we print the default <br> * report for the first thing that went wrong, and more briefly report <br> * on the problem with the ErrorDocument.<br> * @deffunc void ap_send_error_response(request_rec *r, int recursive_error)<br> */<br>AP_DECLARE(void) ap_send_error_response(request_rec *r, int recursive_error);<br><br>其实ap_send_error_response函数也可以向客户端发送一个指定的页面。设置好<br>apr_table_setn(r->headers_out, "Http", "302");<br>apr_table_setn(r->headers_out, "Location", "http://www.yahoo.com");<br>ap_send_error_response的第二个参数设为"NULL",他就跳转到"http://www.yahoo.com"了。<br>这是我看了ap_send_error_response函数源代码后发现的。<br><br><br>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值