`
solidsnake2007
  • 浏览: 28794 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

[转载] Apache模块开发/用C语言扩展apache(3:一个非常简单的apache module)

阅读更多

 

        有了上面几篇文章的基础,大家自己再下点功夫,应该可以去写一些简单的模块了,下面贴出一个很简单的apache module,大家一起分析一下。

 

 

 
$ cd /usr/local/apache2.2.4
$ vi mod_c.c
 

 

 
#include
#include
#include “apr.h”
#include “apr_lib.h”
#include “apr_strings.h”

#define APR_WANT_STRFUNC
#include “apr_want.h”

#include “httpd.h”
#include “http_config.h”
#include “http_core.h”
#include “http_request.h”

module AP_MODULE_DECLARE_DATA c_module;

static int c_handler(request_rec *r)
{
r->content_type=”text/plain”;
ap_rprintf(r,”handler:%s\n”,r->handler);
ap_rprintf(r,”query string:%s\n”,r->args);
ap_rprintf(r,”filename:%s\n”,r->filename);
return OK;
}
static void register_hooks(apr_pool_t *p)
{
ap_hook_handler(c_handler, NULL, NULL, APR_HOOK_MIDDLE);
}


module AP_MODULE_DECLARE_DATA c_module = {
    STANDARD20_MODULE_STUFF,
    NULL,      
    NULL,                       
    NULL,      
    NULL,                       
    NULL,      
    register_hooks   
};
 

    编译并安装这个模块(apache提供的apxs非常好):

 

 

$ ./bin/apxs -c ./mod_c.c
$ ./bin/apxs -a -i -n c mod_c.la
 

    这时apxs会自动帮我们把编译好的mod_c.so安装到modules/目录中,而且httpd.conf中已经把这个module load进去了:

 

[root@cn-weblog apache2.2.4]# grep mod_c conf/httpd.conf     
      LoadModule c_module           modules/mod_c.so
 

    测试这个模块:

 

$ ./bin/apachectl stop
$ ./bin/apachectl start
 

    在IE中访问http://myhostname/index.html?query=yy

    IE中会出现:

        handler:text/html

        query string:query=yy

        filename:/usr/local/apache2.2.4/htdocs/index.html

     说明该module运行成功。

 

     把上面的module简单解释一下。

 

     所有的apache module都必须是这个结构体,里面要定义各个内容。

 

 

module AP_MODULE_DECLARE_DATA c_module = {
    STANDARD20_MODULE_STUFF,
    NULL,      
    NULL,                       
    NULL,      
    NULL,                       
    //上面4项都是定义httpd.conf中命令的作用的
    NULL,       //定义在httpd.conf中添加的命令,和各命令的处理函数
    register_hooks          //hooks,定义什么时候执行我们这个module的相关函数
};
 

    ap_hook_handler(c_handler, NULL, NULL, APR_HOOK_MIDDLE);

    表示在处理内容请求时调用我们函数–c_handler

 

    同样的状态还有

    OK : 成功请求

    DECLINED :忽略 

    HTTP_METHOD_NOT_ALLOWED :错误处理 

    http://httpd.apache.org/docs/2.2/developer/

    提供了非常不错的文档,可以参考一下。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics