2017-07-19 106 views
0

所以我正在努力使自己的apache模块。现在我试图让它返回一个403来测试它,但似乎apache只是完全忽略模块并返回默认页面。这里是我的代码的相关部分:阿帕奇忽略自定义模块

static int request_hook(request_rec* r){ 
    return HTTP_FORBIDDEN; 
} 

/* ******************************************** 
    Register module to Apache 
    ******************************************** */ 

static void register_hooks(apr_pool_t *p) 
{ 
    // We want to hook first so we can issue a deny ASAP if needed 
    ap_hook_log_transaction(request_hook, NULL, NULL, APR_HOOK_REALLY_FIRST); 
} 

module AP_MODULE_DECLARE_DATA my_module = { 
    STANDARD20_MODULE_STUFF, 
    NULL,    /* dir config creater */ 
    NULL,      /* dir merger --- default is to override */ 
    NULL,      /* server config */ 
    NULL,      /* merge server configs */ 
    NULL,     /* command apr_table_t */ 
    register_hooks    /* register hooks */ 
}; 

我的Apache配置文件看起来是这样的:

<VirtualHost *:80> 
     DocumentRoot /var/www/html 
     SetHandler  my_module 
</VirtualHost> 

它是由做

sudo apxs -i -a -c my_module.c && sudo service apache2 restart 
+0

你需要告诉Apache来加载在Apache实例级别的模块,而不是网站的水平。根据您的Apache安装情况,您可能会有一个loadmodules.conf文件,其中包含Apache应加载的所有模块。否则,你可以添加到你的HTTPD.conf“LoadModule module_name /path/on/your/disk/to/moduel.so” – falconspy

+0

我在/ etc/apache2/mods启用了my_module.load文件,如果我加载模块手动在虚拟主机配置我看到日志“my_module已经加载”。 –

+0

你的模块应该在403禁止上做什么? 403禁用的东西是Apache核心的一部分,如果我没有弄错,所有你可以做的就是自定义你的403错误页面。 – falconspy

回答

0

固定编制。问题是功能:

ap_hook_log_transaction(request_hook, NULL, NULL, APR_HOOK_REALLY_FIRST); 

应该是:

ap_hook_handler(request_hook, NULL, NULL, APR_HOOK_REALLY_FIRST);