apache module helloworld, Linux平台使用C编写网页 CGI helloword 实例

时间:2022-12-18 20:41:54

1) 创建文件apache_module_test.c,目录以"/source/moduletest"为例

/*M------------------------------------------------------------------

 *M                           DEFINE HEADER

 *M------------------------------------------------------------------

 *M

 *M  Filename:      apache_module_test.c

 *M 

 *M  Path:             /source/moduletest

 *M

 *M  @ Copyright: TDF ( 24343126@qq.com )

 *M

 *M------------------------------------------------------------------

 *M                          FUN DESCRIPTION

 *M------------------------------------------------------------------

 *M

 *M              Test simple apache module only.

 *M

 *M------------------------------------------------------------------

 *M                         VERSION HISTORY

 *M------------------------------------------------------------------

 *M

 *M     WHEN        BY        NO         DESCRIPTION

 *M     07-08-10   TDF      10123    Initial Version

 *M

 *M------------------------------------------------------------------*/


#include <httpd.h>
#include <http_protocol.h>

#include <http_config.h>

// 定义回调函数

static int helloworld_handler (request_rec *r)

{

      // 实现访问目录区分

      if (!r->handler || strcmp(r->handler, "myhelloworld"))

     {
                return DECLINED;
     }

     // 判断请求方式GET/POST

     if (r->method_number != M_GET)

    {
                return HTTP_METHOD_NOT_ALLOWED;
     }

     ap_set_content_type (r, "text/html; charset=utf-8");

     ap_rputs ("<html><body><h1>HELLO WORLD - Apache Module</h1></body></html>");

  

     return OK:

}

// 注册钩子函数

static void register_helloworld_hooks (apr_pool_t *pool)

{

     ap_hook_handler (helloworld_handler, NULL, NULL, APR_HOOK_MIDDLE);

}

// 定义module

modue AP_MODULE_DECLARE_DATA helloworld_module =

{

     STANDARD20_MODULE_STUFF,

     NULL,

     NULL,

     NULL,

     NULL,

     NULL,   //  使用command_rec创建其他命令集, 在此用不到, 比如my_cmds, 包括config

     register_helloworld_hooks // 注册回调函数

}

2) 创建文件 Makefile

   

CC=gcc

CCFLAGS=-I/usr/local/apache2/include

ModuleTest.so: ModuleTest.o

      [tab] $(CC) -shared -Wl, -soname, libModuleTest.so -o libModuleTest.o $<

ModuleTest.o: apache_module_test.c

      [tab] $(CC) -c -fPIC $(CCFLAGS) module_test.c

#注意:使用[tab]的地方请替换为tab符, 必须使用tab制表符

3) 修改配置文件 httpd.conf,

增加: 

LoadModule myhellowolrd /source/moduletest/ModuleTest.so

<Location /aphelloworld>

    SetHandler myhellowolrd

</Location>

修改监听端口:

Listen 8090

4) 测试环境Linux, Apache2

编译并启动apache

>cd /source/moduletest

>make

>apachectl -k start  -f /source/moduletest/httpd.conf

在IE浏览器输入 http://xx.xx.xx.xx:8090/aphelloworld  预览效果;页面中将出现'HELLO WORLD - Apache Module'

P.S. 要写复杂的Web应用,靠C恐怕相当困难,我觉得首先需要利用C++,在Module Handler里可调用C++函数来实现功能划分,其中一种比较快捷的方法是通过找地址的方式,除此之外,设想中还需:

(1) Xml + Xslt, 有了xslt后才好在windows下把html框架页面调试好。

(2) 需要一个C#中的类XsltTransform在Linux C/C++下面的实现。

(3) 一个类似.Net中的DataSet,在Linux C/C++下的实现;并且有WriteXml()的功能。

有了Transfomer, 并有XML和XSLT, 两者一转译Html就OK了;另外还需解决接收post上来的数据。