Linux下Apache模块开发
环境:Linux RedHat
首先来介绍下apache的一个工具apxs。apxs是一个为Apache HTTP服务器编译和安装扩展模块的工具,用于编译一个或多个源程序或目标代码文件为动态共享对象,使之可以用由mod_so提供的LoadModule指令在运行时加载到Apache服务器中。
安装好Apache服务器后,安装目录的bin目录下包含apxs工具。
模块开发代码 mod_jump_filter.c 如下:
/******************************************************************************
版权所有 (C), 2018-2019
******************************************************************************
文 件 名 : mod_jump_filter.c
版 本 号 : V1.0
作 者 : lijd
生成日期 : 2018年12月07日
功能描述 : 服务器被访问时获取请求头和请求数据
修改历史 :
*****************************************************************************/
#include <httpd.h>
#include <http_protocol.h>
#include <http_config.h>
/*****************************************************************************
函 数 名 : gethead_handler
功能描述 : 回掉函数获取请求体请求体
输入参数 : 无
输出参数 : 无
返 回 值 : 无
作 者 : lijd
日 期 : 2018年12月07日
******************************************************************************/
static int gethead_handler(request_rec *r)
{
if (!r->handler) {
return DECLINED;
}
char *pInfo1 = NULL;
char *pInfo2 = NULL;
ap_set_content_type(r, "text/html;charset=ascii");
/* 获取Host头信息 */
pInfo1 = apr_table_get(r->headers_in, "Host");
printf("Host :%s\n",pInfo1);
/* User-Agent */
pInfo2 = apr_table_get(r->headers_in, "User-Agent");
printf("User-Agent :%s\n",pInfo2);
/* 获取Post请求体数据 */
apr_bucket_brigade *input_brigade = apr_brigade_create(r->pool, r->connection->bucket_alloc);
apr_status_t status;
apr_bucket *bucket;
status = ap_get_brigade(r->input_filters, input_brigade, AP_MODE_READBYTES, APR_BLOCK_READ, HUGE_STRING_LEN);
if (status != APR_SUCCESS)
{
return HTTP_BAD_REQUEST;
}
for (bucket = APR_BRIGADE_FIRST(input_brigade);
bucket != APR_BRIGADE_SENTINEL(input_brigade);
bucket = APR_BUCKET_NEXT(bucket))
{
const char *data;
apr_size_t len;
if (APR_BUCKET_IS_EOS(bucket)) {
break;
}
if (bucket->length == 0) {
continue;
}
status = apr_bucket_read(bucket, &data, &len, APR_BLOCK_READ);
if (status != APR_SUCCESS) {
apr_brigade_destroy(input_brigade);
return HTTP_BAD_REQUEST;
}
printf("Body : %s \n",data);
}
return DECLINED;
}
/*****************************************************************************
函 数 名 : JumpFilterRegisterHooks
功能描述 : 注册钩子函数
输入参数 : 无
输出参数 : 无
返 回 值 : 无
作 者 : lijd
日 期 : 2018年12月07日
*****************************************************************************/
static void JumpFilterRegisterHooks(apr_pool_t *pool)
{
ap_hook_handler(gethead_handler, NULL, NULL, APR_HOOK_MIDDLE);
}
/*****************************************************************************
函 数 名 : jump_filter_module
功能描述 : 模块注册
输入参数 : 无
输出参数 : 无
返 回 值 : 无
作 者 : lijd
日 期 : 2018年12月07日
*****************************************************************************/
module AP_MODULE_DECLARE_DATA jump_filter_module = {
STANDARD20_MODULE_STUFF, //用于编译后的模块产生版本信息
NULL, /* 创建目录配置结构*/
NULL, /* 合并目录配置结构 */
NULL, /* 创建主机配置结构 */
NULL, /* 合并主机配置结构 */
NULL, /* 为模块配置相关指令 */
JumpFilterRegisterHooks /* 注册模块的钩子函数 */
};
编译命令:apxs -i -c -a mod_jump_filter.c
运行结果如下:
该模块已编译成功并且已被动态加载至Apache运行模块中,查看Apache的配置文件如下:
重启Apache并将其运行至前台(参数为:-X),查看打印信息如下:
这样一来一个简单的apache模块已经开发好了。